//# 139 errors, 6,771 messages
//#
/*
    //#IRCParser.java:1:1: class: com.dmdirc.parser.irc.IRCParser$1
    //#IRCParser.java:1:1: method: com.dmdirc.parser.irc.IRCParser$1.com.dmdirc.parser.irc.IRCParser$1__static_init
    //#IRCParser.java:1:1: class: com.dmdirc.parser.irc.IRCParser
    //#IRCParser.java:1:1: method: com.dmdirc.parser.irc.IRCParser.com.dmdirc.parser.irc.IRCParser__static_init
 * Copyright (c) 2006-2009 Chris Smith, Shane Mc Cormack, Gregory Holmes
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.dmdirc.parser.irc;

import com.dmdirc.parser.irc.callbacks.CallbackManager;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.Collection;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.Map;
import java.util.Timer;
import java.util.Queue;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicBoolean;

import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

/**
 * IRC Parser.
 *
 * @author Shane Mc Cormack
 */
public class IRCParser implements Runnable {

	/** Max length an outgoing line should be (NOT including \r\n). */
	public static final int MAX_LINELENGTH = 510;

	/** General Debug Information. */
	public static final int DEBUG_INFO = 1;
	/** Socket Debug Information. */
	public static final int DEBUG_SOCKET = 2;
	/** Processing Manager Debug Information. */
	public static final int DEBUG_PROCESSOR = 4;
	/** List Mode Queue Debug Information. */
	public static final int DEBUG_LMQ = 8;
//	public static final int DEBUG_SOMETHING = 16; //Next thingy

	/** Attempt to update user host all the time, not just on Who/Add/NickChange. */
	static final boolean ALWAYS_UPDATECLIENT = true;

	/** Byte used to show that a non-boolean mode is a list (b). */
	static final byte MODE_LIST = 1;
	/** Byte used to show that a non-boolean mode is not a list, and requires a parameter to set (lk). */
	static final byte MODE_SET = 2;
	/** Byte used to show that a non-boolean mode is not a list, and requires a parameter to unset (k). */
	static final byte MODE_UNSET = 4;

	/**
	 * This is what the user wants settings to be.
	 * Nickname here is *not* always accurate.<br><br>
	 * ClientInfo variable tParser.getMyself() should be used for accurate info.
	 */
	public MyInfo me = new MyInfo();
	/**	Server Info requested by user. */
	public ServerInfo server = new ServerInfo();

	/** Timer for server ping. */
	private Timer pingTimer = null;
    /** Semaphore for access to pingTimer. */
    private Semaphore pingTimerSem = new Semaphore(1);
	/** Length of time to wait between ping stuff. */
	private long pingTimerLength = 10000;
	/** Is a ping needed? */
	private volatile AtomicBoolean pingNeeded = new AtomicBoolean(false);
	/** Time last ping was sent at. */
	private long pingTime;
	/** Current Server Lag. */
	private long serverLag;
	/** Last value sent as a ping argument. */
	private String lastPingValue = "";

	/**
	 * Count down to next ping.
	 * The timer fires every 10 seconds, this value is decreased every time the
	 * timer fires.<br>
	 * Once it reaches 0, we send a ping, and reset it to 6, this means we ping
	 * the server every minute.
	 *
	 * @see setPingCountDownLength
	 */
	private int pingCountDown;
	/**
	 * Amount of times the timer has to fire for inactivity before sending a ping.
	 *
	 * @see setPingCountDownLength
	 */
	private int pingCountDownLength = 6;

	/** Name the server calls itself. */
	String sServerName;

	/** Network name. This is "" if no network name is provided */
	String sNetworkName;

	/** This is what we think the nickname should be. */
	String sThinkNickname;

	/** When using inbuilt pre-001 NickInUse handler, have we tried our AltNick. */
	boolean triedAlt;

	/** Have we recieved the 001. */
	boolean got001;
	/** Have we fired post005? */
	boolean post005;
	/** Has the thread started execution yet, (Prevents run() being called multiple times). */
	boolean hasBegan;

	/** Hashtable storing known prefix modes (ohv). */
	final Map<Character, Long> hPrefixModes = new Hashtable<Character, Long>();
	/**
	 * Hashtable maping known prefix modes (ohv) to prefixes (@%+) - Both ways.
	 * Prefix map contains 2 pairs for each mode. (eg @ => o and o => @)
	 */
	final Map<Character, Character> hPrefixMap = new Hashtable<Character, Character>();
	/** Integer representing the next avaliable integer value of a prefix mode. */
	long nNextKeyPrefix = 1;
	/** Hashtable storing known user modes (owxis etc). */
	final Map<Character, Long> hUserModes = new Hashtable<Character, Long>();
	/** Integer representing the next avaliable integer value of a User mode. */
	long nNextKeyUser = 1;
	/**
	 * Hashtable storing known boolean chan modes (cntmi etc).
	 * Valid Boolean Modes are stored as Hashtable.pub('m',1); where 'm' is the mode and 1 is a numeric value.<br><br>
	 * Numeric values are powers of 2. This allows up to 32 modes at present (expandable to 64)<br><br>
	 * ChannelInfo/ChannelClientInfo etc provide methods to view the modes in a human way.<br><br>
	 * <br>
	 * Channel modes discovered but not listed in 005 are stored as boolean modes automatically (and a ERROR_WARNING Error is called)
	 */
	final Map<Character, Long> hChanModesBool = new Hashtable<Character, Long>();
	/** Integer representing the next avaliable integer value of a Boolean mode. */

	long nNextKeyCMBool = 1;

	/**
	 * Hashtable storing known non-boolean chan modes (klbeI etc).
	 * Non Boolean Modes (for Channels) are stored together in this hashtable, the value param
	 * is used to show the type of variable. (List (1), Param just for set (2), Param for Set and Unset (2+4=6))<br><br>
	 * <br>
	 * see MODE_LIST<br>
	 * see MODE_SET<br>
	 * see MODE_UNSET<br>
	 */
	final Map<Character, Byte> hChanModesOther = new Hashtable<Character, Byte>();

	/** The last line of input recieved from the server */
	String lastLine = "";
	/** Should the lastline (where given) be appended to the "data" part of any onErrorInfo call? */
	boolean addLastLine = false;

	/**
	* Channel Prefixes (ie # + etc).
	* The "value" for these is always true.
	*/
	final Map<Character, Boolean> hChanPrefix = new Hashtable<Character, Boolean>();
	/** Hashtable storing all known clients based on nickname (in lowercase). */
	private final Map<String, ClientInfo> hClientList = new Hashtable<String, ClientInfo>();
	/** Hashtable storing all known channels based on chanel name (inc prefix - in lowercase). */
	private final Map<String, ChannelInfo> hChannelList = new Hashtable<String, ChannelInfo>();
	/** Reference to the ClientInfo object that references ourself. */
	private ClientInfo cMyself = new ClientInfo(this, "myself").setFake(true);
	/** Hashtable storing all information gathered from 005. */
	final Map<String, String> h005Info = new Hashtable<String, String>();

	/** Ignore List. */
	RegexStringList myIgnoreList = new RegexStringList();

	/** Reference to the callback Manager. */
	CallbackManager myCallbackManager = new CallbackManager(this);
	/** Reference to the Processing Manager. */
	ProcessingManager myProcessingManager = new ProcessingManager(this);

	/** Should we automatically disconnect on fatal errors?. */
	private boolean disconnectOnFatal = true;

	/** Current Socket State. */
	protected SocketState currentSocketState = SocketState.NULL;

	/** This is the socket used for reading from/writing to the IRC server. */
	private Socket socket;
	/** Used for writing to the server. */
	private PrintWriter out;
	/** Used for reading from the server. */
	private BufferedReader in;

	/** This is the default TrustManager for SSL Sockets, it trusts all ssl certs. */
	private final TrustManager[] trustAllCerts = {
		new X509TrustManager() {
    //#IRCParser.java:224: method: void com.dmdirc.parser.irc.IRCParser$1.com.dmdirc.parser.irc.IRCParser$1(IRCParser)
    //#input(void com.dmdirc.parser.irc.IRCParser$1(IRCParser)): Param_1
    //#input(void com.dmdirc.parser.irc.IRCParser$1(IRCParser)): this
    //#output(void com.dmdirc.parser.irc.IRCParser$1(IRCParser)): this.this$0
    //#post(void com.dmdirc.parser.irc.IRCParser$1(IRCParser)): this.this$0 == Param_1
    //#post(void com.dmdirc.parser.irc.IRCParser$1(IRCParser)): init'ed(this.this$0)
    //#IRCParser.java:224: end of method: void com.dmdirc.parser.irc.IRCParser$1.com.dmdirc.parser.irc.IRCParser$1(IRCParser)
			@Override
			public X509Certificate[] getAcceptedIssuers() { return null; }
    //#IRCParser.java:226: method: X509Certificate[] com.dmdirc.parser.irc.IRCParser$1.getAcceptedIssuers()
    //#output(X509Certificate[] getAcceptedIssuers()): return_value
    //#post(X509Certificate[] getAcceptedIssuers()): return_value == null
    //#IRCParser.java:226: end of method: X509Certificate[] com.dmdirc.parser.irc.IRCParser$1.getAcceptedIssuers()
			@Override
			public void checkClientTrusted(final X509Certificate[] certs, final String authType) { }
    //#IRCParser.java:228: method: void com.dmdirc.parser.irc.IRCParser$1.checkClientTrusted(X509Certificate[], String)
    //#IRCParser.java:228: end of method: void com.dmdirc.parser.irc.IRCParser$1.checkClientTrusted(X509Certificate[], String)
			@Override
			public void checkServerTrusted(final X509Certificate[] certs, final String authType) { }
    //#IRCParser.java:230: method: void com.dmdirc.parser.irc.IRCParser$1.checkServerTrusted(X509Certificate[], String)
    //#IRCParser.java:230: end of method: void com.dmdirc.parser.irc.IRCParser$1.checkServerTrusted(X509Certificate[], String)
		},
	};

	/** Should fake (channel)clients be created for callbacks where they do not exist? */
	boolean createFake = false;

	/** Should channels automatically request list modes? */
	boolean autoListMode = true;

	/** Should part/quit/kick callbacks be fired before removing the user internally? */
	boolean removeAfterCallback = true;

	/** This is the TrustManager used for SSL Sockets. */
	private TrustManager[] myTrustManager = trustAllCerts;

	/** The KeyManagers used for client certificates for SSL sockets. */
	private KeyManager[] myKeyManagers;

	/** This is the IP we want to bind to. */
	private String bindIP = "";

	/**
	 * Default constructor, ServerInfo and MyInfo need to be added separately (using IRC.me and IRC.server).
	 */
	public IRCParser() { this(null, null); }
    //#IRCParser.java:255: method: void com.dmdirc.parser.irc.IRCParser.com.dmdirc.parser.irc.IRCParser()
    //#IRCParser.java:255: Warning: call too complex - analysis skipped
    //#    call on void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void com.dmdirc.parser.irc.IRCParser()
    //#    unanalyzed callee: void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)
    //#input(void com.dmdirc.parser.irc.IRCParser()): this
    //#IRCParser.java:255: end of method: void com.dmdirc.parser.irc.IRCParser.com.dmdirc.parser.irc.IRCParser()
	/**
	 * Constructor with ServerInfo, MyInfo needs to be added separately (using IRC.me).
	 *
	 * @param serverDetails Server information.
	 */
	public IRCParser(final ServerInfo serverDetails) { this(null, serverDetails); }
    //#IRCParser.java:261: method: void com.dmdirc.parser.irc.IRCParser.com.dmdirc.parser.irc.IRCParser(ServerInfo)
    //#IRCParser.java:261: Warning: call too complex - analysis skipped
    //#    call on void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void com.dmdirc.parser.irc.IRCParser(ServerInfo)
    //#    unanalyzed callee: void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)
    //#input(void com.dmdirc.parser.irc.IRCParser(ServerInfo)): serverDetails
    //#input(void com.dmdirc.parser.irc.IRCParser(ServerInfo)): this
    //#IRCParser.java:261: end of method: void com.dmdirc.parser.irc.IRCParser.com.dmdirc.parser.irc.IRCParser(ServerInfo)
	/**
	 * Constructor with MyInfo, ServerInfo needs to be added separately (using IRC.server).
	 *
	 * @param myDetails Client information.
	 */
	public IRCParser(final MyInfo myDetails) { this(myDetails, null); }
    //#IRCParser.java:267: method: void com.dmdirc.parser.irc.IRCParser.com.dmdirc.parser.irc.IRCParser(MyInfo)
    //#IRCParser.java:267: Warning: call too complex - analysis skipped
    //#    call on void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void com.dmdirc.parser.irc.IRCParser(MyInfo)
    //#    unanalyzed callee: void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo)): myDetails
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo)): this
    //#IRCParser.java:267: end of method: void com.dmdirc.parser.irc.IRCParser.com.dmdirc.parser.irc.IRCParser(MyInfo)
	/**
	 * Constructor with ServerInfo and MyInfo.
	 *
	 * @param serverDetails Server information.
	 * @param myDetails Client information.
	 */
	public IRCParser(final MyInfo myDetails, final ServerInfo serverDetails) {
    //#IRCParser.java:274: method: void com.dmdirc.parser.irc.IRCParser.com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): " - DMDIrc"._tainted
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): "&#09; Added handler for: "._tainted
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): "-"._tainted
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): "Adding processor: "._tainted
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): "Callback not found: "._tainted
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): "IRCParser"._tainted
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): "On"._tainted
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): "OnDebugInfo"._tainted
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): "myself"._tainted
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): __Descendant_Table[others]
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;[Ljava/lang/Object;)Z
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): __Dispatch_Table.updateCharArrays(B)V
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com.dmdirc.parser.irc.callbacks.CallbackManager__static_init.new Class[](CallbackManager__static_init#1).length
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com.dmdirc.parser.irc.callbacks.CallbackManager__static_init.new Class[](CallbackManager__static_init#1)[0..4_294_967_295]
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/IRCProcessor.__Descendant_Table[others]
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/IRCProcessor.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/Process001.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/Process004005.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/Process464.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessAway.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessInvite.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessJoin.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessKick.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessListModes.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessMOTD.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessMessage.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessMode.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessNames.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessNick.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessNickInUse.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessNoticeAuth.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessPart.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessQuit.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessTopic.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessWallops.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessWho.__Dispatch_Table.handles()[Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessingManager.__Descendant_Table[com/dmdirc/parser/irc/ProcessingManager]
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessingManager.__Descendant_Table[others]
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessingManager.__Dispatch_Table.addProcessor(Lcom/dmdirc/parser/irc/IRCProcessor;)V
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/ProcessingManager.__Dispatch_Table.addProcessor([Ljava/lang/String;Lcom/dmdirc/parser/irc/IRCProcessor;)V
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/SocketState.CLOSED
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/SocketState.NULL
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/callbacks/CallbackManager.CLASSES
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): myDetails
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): serverDetails
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this
    //#input(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.__Tag
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ArrayList(RegexStringList#1) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new AtomicBoolean(IRCParser#4) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new CallbackManager(IRCParser#16) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myCallbackManager.__Tag
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myCallbackManager.callbackHash
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myCallbackManager.myParser
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).__Tag
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).bIsFake
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).lModeQueue
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).myAwayReason
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).myChannelClientInfos
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).myMap
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).myParser
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).sHost
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).sIdent
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).sNickname
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).sRealName
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(resetState#1) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.__Tag
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.bIsFake
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.lModeQueue
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.myAwayReason
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.myChannelClientInfos
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.myMap
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.myParser
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.sHost
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.sIdent
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.sNickname
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.sRealName
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new HashMap(ClientInfo#3) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(CallbackManager#1) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(ClientInfo#1) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#10) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#11) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#12) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#14) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#5) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#6) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#7) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#8) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#9) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(ProcessingManager#1) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new IRCParser$1(IRCParser#19) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myTrustManager[0].__Tag
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myTrustManager[0].this$0
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new IRCStringConverter(updateCharArrays#1) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.__Tag
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.limit
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.lowercase
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.uppercase
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new LinkedList(ClientInfo#2) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).__Tag
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).altNickname
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).nickname
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).prependChar
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).realname
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).username
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ProcessingManager(IRCParser#17) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myProcessingManager.__Tag
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myProcessingManager.myParser
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myProcessingManager.processHash
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new RegexStringList(IRCParser#15) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myIgnoreList.__Tag
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myIgnoreList.ignoreInfo
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Semaphore(IRCParser#3) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).__Tag
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).host
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).isSSL
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).password
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).port
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).proxyHost
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).proxyPass
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).proxyPort
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).proxyUser
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).useSocksProxy
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new TrustManager[](IRCParser#18) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myTrustManager.length
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myTrustManager[0]
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new char[](IRCStringConverter#1) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.lowercase.length
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.lowercase[0..65_535]
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new char[](IRCStringConverter#2) num objects
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.uppercase.length
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.uppercase[0..65_567]
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.__Tag
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.addLastLine
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.autoListMode
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.bindIP
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.createFake
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.currentSocketState
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.disconnectOnFatal
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.got001
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.h005Info
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hChanModesBool
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hChanModesOther
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hChanPrefix
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hChannelList
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hClientList
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hPrefixMap
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hPrefixModes
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hUserModes
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.lastLine
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.lastPingValue
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.me
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myCallbackManager
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myIgnoreList
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myProcessingManager
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myTrustManager
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.nNextKeyCMBool
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.nNextKeyPrefix
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.nNextKeyUser
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.pingCountDownLength
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.pingNeeded
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.pingTimer
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.pingTimerLength
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.pingTimerSem
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.post005
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.removeAfterCallback
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.sNetworkName
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.sServerName
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.server
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.triedAlt
    //#output(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.trustAllCerts
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): java.lang.StringBuilder:toString(...)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ArrayList(RegexStringList#1)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new AtomicBoolean(IRCParser#4)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new CallbackManager(IRCParser#16)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(resetState#1)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new HashMap(ClientInfo#3)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(CallbackManager#1)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(ClientInfo#1)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#10)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#11)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#12)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#14)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#5)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#6)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#7)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#8)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#9)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(ProcessingManager#1)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new IRCParser$1(IRCParser#19)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new IRCStringConverter(updateCharArrays#1)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new LinkedList(ClientInfo#2)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ProcessingManager(IRCParser#17)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new RegexStringList(IRCParser#15)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Semaphore(IRCParser#3)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new TrustManager[](IRCParser#18)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new char[](IRCStringConverter#1)
    //#new obj(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new char[](IRCStringConverter#2)
    //#pre[3] (void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[1] (void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): (soft) com.dmdirc.parser.irc.callbacks.CallbackManager__static_init.new Class[](CallbackManager__static_init#1)[0..4_294_967_295] != null
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): init'ed(this.addLastLine)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.autoListMode == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.disconnectOnFatal == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.nNextKeyCMBool == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.nNextKeyPrefix == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.nNextKeyUser == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.removeAfterCallback == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ArrayList(RegexStringList#1) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new AtomicBoolean(IRCParser#4) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new CallbackManager(IRCParser#16) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).bIsFake == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(resetState#1) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.bIsFake == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new HashMap(ClientInfo#3) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(CallbackManager#1) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(ClientInfo#1) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#10) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#11) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#12) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#14) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#5) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#6) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#7) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#8) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(IRCParser#9) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Hashtable(ProcessingManager#1) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new IRCParser$1(IRCParser#19) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new IRCStringConverter(updateCharArrays#1) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new LinkedList(ClientInfo#2) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ProcessingManager(IRCParser#17) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new RegexStringList(IRCParser#15) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new Semaphore(IRCParser#3) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new TrustManager[](IRCParser#18) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myTrustManager.length == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new char[](IRCStringConverter#1) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new char[](IRCStringConverter#2) num objects == 1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.bindIP == &""
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.lastLine == &""
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.lastPingValue == &""
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.sNetworkName == &""
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.sServerName == &""
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).myAwayReason == &""
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).sRealName == &""
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.myAwayReason == &""
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.sRealName == &""
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).password == &""
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).proxyPass == &""
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).proxyUser == &""
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself == &new ClientInfo(resetState#1)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): init'ed(this.createFake)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.currentSocketState == &com.dmdirc.parser.irc.SocketState__static_init.new SocketState(SocketState__static_init#2)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.got001 == 0
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.post005 == 0
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.triedAlt == 0
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.h005Info == &new Hashtable(IRCParser#14)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hChanModesBool == &new Hashtable(IRCParser#8)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hChanModesOther == &new Hashtable(IRCParser#9)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hChanPrefix == &new Hashtable(IRCParser#10)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hChannelList == &new Hashtable(IRCParser#12)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hClientList == &new Hashtable(IRCParser#11)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hPrefixMap == &new Hashtable(IRCParser#6)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hPrefixModes == &new Hashtable(IRCParser#5)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.hUserModes == &new Hashtable(IRCParser#7)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.me == One-of{&new MyInfo(IRCParser#1), myDetails}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.me != null
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myCallbackManager == &new CallbackManager(IRCParser#16)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myIgnoreList == &new RegexStringList(IRCParser#15)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myProcessingManager == &new ProcessingManager(IRCParser#17)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myTrustManager == &new TrustManager[](IRCParser#18)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.trustAllCerts == &new TrustManager[](IRCParser#18)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.pingCountDownLength == 6
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.pingNeeded == &new AtomicBoolean(IRCParser#4)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.pingTimer == null
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.pingTimerLength == 10_000
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.pingTimerSem == &new Semaphore(IRCParser#3)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.server == One-of{&new ServerInfo(IRCParser#2), serverDetails}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.server != null
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter == &new IRCStringConverter(updateCharArrays#1)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myCallbackManager.__Tag == com/dmdirc/parser/irc/callbacks/CallbackManager
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myCallbackManager.callbackHash == &new Hashtable(CallbackManager#1)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myCallbackManager.myParser == this
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myCallbackManager.myParser != null
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).myParser == this.myCallbackManager.myParser
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.myParser == this.myCallbackManager.myParser
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myTrustManager[0].this$0 == this.myCallbackManager.myParser
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myProcessingManager.myParser == this.myCallbackManager.myParser
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).__Tag == com/dmdirc/parser/irc/ClientInfo
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.__Tag == com/dmdirc/parser/irc/ClientInfo
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).lModeQueue == &new LinkedList(ClientInfo#2)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).myChannelClientInfos == &new Hashtable(ClientInfo#1)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).myMap == &new HashMap(ClientInfo#3)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).sHost == One-of{this.bindIP, undefined}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).sHost in Addr_Set{null,&""}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).sIdent == One-of{this.bindIP, undefined}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ClientInfo(IRCParser#13).sIdent in Addr_Set{null,&""}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): init'ed(new ClientInfo(IRCParser#13).sNickname)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.lModeQueue == &new LinkedList(ClientInfo#2)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.myChannelClientInfos == &new Hashtable(ClientInfo#1)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.myMap == &new HashMap(ClientInfo#3)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.sHost == One-of{this.bindIP, undefined}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.sHost in Addr_Set{null,&""}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.sIdent == One-of{this.bindIP, undefined}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.sIdent in Addr_Set{null,&""}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.sNickname == undefined
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.cMyself.sNickname == null
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myTrustManager[0].__Tag == com/dmdirc/parser/irc/IRCParser$1
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.limit == 4
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.lowercase == &new char[](IRCStringConverter#1)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.uppercase == &new char[](IRCStringConverter#2)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).__Tag == com/dmdirc/parser/irc/MyInfo
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).altNickname == One-of{&"IRC-Parser", &java.lang.StringBuilder:toString(...)}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).altNickname in Addr_Set{&"IRC-Parser",&java.lang.StringBuilder:toString(...)}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).nickname != null
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).prependChar == 95
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).realname == One-of{&"DMDIrc IRCParser", &java.lang.StringBuilder:toString(...)}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).realname in Addr_Set{&"DMDIrc IRCParser",&java.lang.StringBuilder:toString(...)}
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new MyInfo(IRCParser#1).username != null
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myProcessingManager.__Tag == com/dmdirc/parser/irc/ProcessingManager
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myProcessingManager.processHash == &new Hashtable(ProcessingManager#1)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myIgnoreList.__Tag == com/dmdirc/parser/irc/RegexStringList
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myIgnoreList.ignoreInfo == &new ArrayList(RegexStringList#1)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).__Tag == com/dmdirc/parser/irc/ServerInfo
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).host == &"irc.quakenet.org"
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): init'ed(new ServerInfo(IRCParser#2).isSSL)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).port == 6_667
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).proxyHost == &"127.0.0.1"
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): new ServerInfo(IRCParser#2).proxyPort == 1_080
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): init'ed(new ServerInfo(IRCParser#2).useSocksProxy)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.myTrustManager[0] == &new IRCParser$1(IRCParser#19)
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.lowercase.length == 127
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): this.stringConverter.uppercase.length == 127
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): possibly_updated(this.stringConverter.lowercase[0..65_535])
    //#post(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): possibly_updated(this.stringConverter.uppercase[0..65_567])
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.concurrent.Semaphore:acquireUninterruptibly
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.concurrent.Semaphore:release
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.Map:clear
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:call
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:callDebugInfo
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:setFake
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.String:format
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.Hashtable:containsKey
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.Class:getSimpleName
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.Hashtable
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.Class:isAnnotationPresent
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.Class:asSubclass
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.Object:getClass
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.Class:getPackage
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.Package:getName
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.Class:getName
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:doDebug
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.Hashtable:remove
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.Hashtable:put
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:handles
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:com.dmdirc.parser.irc.IRCProcessor
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): Effects-of-calling:java.util.HashMap
    //#test_vector(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): myDetails: Addr_Set{null}, Inverse{null}
    //#test_vector(void com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)): serverDetails: Addr_Set{null}, Inverse{null}
		if (myDetails != null) { this.me = myDetails; }
		if (serverDetails != null) { this.server = serverDetails; }
		resetState();
	}

	/**
	 * Get the current Value of bindIP.
	 *
	 * @return Value of bindIP ("" for default IP)
	 */
	public String getBindIP() { return bindIP; }
    //#IRCParser.java:285: method: String com.dmdirc.parser.irc.IRCParser.getBindIP()
    //#input(String getBindIP()): this
    //#input(String getBindIP()): this.bindIP
    //#output(String getBindIP()): return_value
    //#pre[2] (String getBindIP()): init'ed(this.bindIP)
    //#post(String getBindIP()): return_value == this.bindIP
    //#post(String getBindIP()): init'ed(return_value)
    //#IRCParser.java:285: end of method: String com.dmdirc.parser.irc.IRCParser.getBindIP()

	/**
	 * Set the current Value of bindIP.
	 *
	 * @param newValue New value to set bindIP
	 */
	public void setBindIP(final String newValue) { bindIP = newValue; }
    //#IRCParser.java:292: method: void com.dmdirc.parser.irc.IRCParser.setBindIP(String)
    //#input(void setBindIP(String)): newValue
    //#input(void setBindIP(String)): this
    //#output(void setBindIP(String)): this.bindIP
    //#post(void setBindIP(String)): this.bindIP == newValue
    //#post(void setBindIP(String)): init'ed(this.bindIP)
    //#IRCParser.java:292: end of method: void com.dmdirc.parser.irc.IRCParser.setBindIP(String)

	/**
	 * Get the current Value of createFake.
	 *
	 * @return Value of createFake (true if fake clients will be added for callbacks, else false)
	 */
	public boolean getCreateFake() { return createFake; }
    //#IRCParser.java:299: method: bool com.dmdirc.parser.irc.IRCParser.getCreateFake()
    //#input(bool getCreateFake()): this
    //#input(bool getCreateFake()): this.createFake
    //#output(bool getCreateFake()): return_value
    //#pre[2] (bool getCreateFake()): init'ed(this.createFake)
    //#post(bool getCreateFake()): return_value == this.createFake
    //#post(bool getCreateFake()): init'ed(return_value)
    //#IRCParser.java:299: end of method: bool com.dmdirc.parser.irc.IRCParser.getCreateFake()

	/**
	 * Set the current Value of createFake.
	 *
	 * @param newValue New value to set createFake
	 */
	public void setCreateFake(final boolean newValue) { createFake = newValue; }
    //#IRCParser.java:306: method: void com.dmdirc.parser.irc.IRCParser.setCreateFake(bool)
    //#input(void setCreateFake(bool)): newValue
    //#input(void setCreateFake(bool)): this
    //#output(void setCreateFake(bool)): this.createFake
    //#post(void setCreateFake(bool)): this.createFake == newValue
    //#post(void setCreateFake(bool)): init'ed(this.createFake)
    //#IRCParser.java:306: end of method: void com.dmdirc.parser.irc.IRCParser.setCreateFake(bool)

	/**
	 * Get the current Value of autoListMode.
	 *
	 * @return Value of autoListMode (true if channels automatically ask for list modes on join, else false)
	 */
	public boolean getAutoListMode() { return autoListMode; }
    //#IRCParser.java:313: method: bool com.dmdirc.parser.irc.IRCParser.getAutoListMode()
    //#input(bool getAutoListMode()): this
    //#input(bool getAutoListMode()): this.autoListMode
    //#output(bool getAutoListMode()): return_value
    //#pre[2] (bool getAutoListMode()): init'ed(this.autoListMode)
    //#post(bool getAutoListMode()): return_value == this.autoListMode
    //#post(bool getAutoListMode()): init'ed(return_value)
    //#IRCParser.java:313: end of method: bool com.dmdirc.parser.irc.IRCParser.getAutoListMode()

	/**
	 * Set the current Value of autoListMode.
	 *
	 * @param newValue New value to set autoListMode
	 */
	public void setAutoListMode(final boolean newValue) { autoListMode = newValue; }
    //#IRCParser.java:320: method: void com.dmdirc.parser.irc.IRCParser.setAutoListMode(bool)
    //#input(void setAutoListMode(bool)): newValue
    //#input(void setAutoListMode(bool)): this
    //#output(void setAutoListMode(bool)): this.autoListMode
    //#post(void setAutoListMode(bool)): this.autoListMode == newValue
    //#post(void setAutoListMode(bool)): init'ed(this.autoListMode)
    //#IRCParser.java:320: end of method: void com.dmdirc.parser.irc.IRCParser.setAutoListMode(bool)

	/**
	 * Get the current Value of removeAfterCallback.
	 *
	 * @return Value of removeAfterCallback (true if kick/part/quit callbacks are fired before internal removal)
	 */
	public boolean getRemoveAfterCallback() { return removeAfterCallback; }
    //#IRCParser.java:327: method: bool com.dmdirc.parser.irc.IRCParser.getRemoveAfterCallback()
    //#input(bool getRemoveAfterCallback()): this
    //#input(bool getRemoveAfterCallback()): this.removeAfterCallback
    //#output(bool getRemoveAfterCallback()): return_value
    //#pre[2] (bool getRemoveAfterCallback()): init'ed(this.removeAfterCallback)
    //#post(bool getRemoveAfterCallback()): return_value == this.removeAfterCallback
    //#post(bool getRemoveAfterCallback()): init'ed(return_value)
    //#IRCParser.java:327: end of method: bool com.dmdirc.parser.irc.IRCParser.getRemoveAfterCallback()

	/**
	 * Get the current Value of removeAfterCallback.
	 *
	 * @param newValue New value to set removeAfterCallback
	 */
	public void setRemoveAfterCallback(final boolean newValue) { removeAfterCallback = newValue; }
    //#IRCParser.java:334: method: void com.dmdirc.parser.irc.IRCParser.setRemoveAfterCallback(bool)
    //#input(void setRemoveAfterCallback(bool)): newValue
    //#input(void setRemoveAfterCallback(bool)): this
    //#output(void setRemoveAfterCallback(bool)): this.removeAfterCallback
    //#post(void setRemoveAfterCallback(bool)): this.removeAfterCallback == newValue
    //#post(void setRemoveAfterCallback(bool)): init'ed(this.removeAfterCallback)
    //#IRCParser.java:334: end of method: void com.dmdirc.parser.irc.IRCParser.setRemoveAfterCallback(bool)

	/**
	 * Get the current Value of addLastLine.
	 *
	 * @return Value of addLastLine (true if lastLine info will be automatically
	 *         added to the errorInfo data line). This should be true if lastLine
	 *         isn't handled any other way.
	 */
	public boolean getAddLastLine() { return addLastLine; }
    //#IRCParser.java:343: method: bool com.dmdirc.parser.irc.IRCParser.getAddLastLine()
    //#input(bool getAddLastLine()): this
    //#input(bool getAddLastLine()): this.addLastLine
    //#output(bool getAddLastLine()): return_value
    //#pre[2] (bool getAddLastLine()): init'ed(this.addLastLine)
    //#post(bool getAddLastLine()): return_value == this.addLastLine
    //#post(bool getAddLastLine()): init'ed(return_value)
    //#IRCParser.java:343: end of method: bool com.dmdirc.parser.irc.IRCParser.getAddLastLine()

	/**
	 * Get the current Value of addLastLine.
	 * This returns "this" and thus can be used in the construction line.
	 *
	 * @param newValue New value to set addLastLine
	 */
	public void setAddLastLine(final boolean newValue) { addLastLine = newValue; }
    //#IRCParser.java:351: method: void com.dmdirc.parser.irc.IRCParser.setAddLastLine(bool)
    //#input(void setAddLastLine(bool)): newValue
    //#input(void setAddLastLine(bool)): this
    //#output(void setAddLastLine(bool)): this.addLastLine
    //#post(void setAddLastLine(bool)): this.addLastLine == newValue
    //#post(void setAddLastLine(bool)): init'ed(this.addLastLine)
    //#IRCParser.java:351: end of method: void com.dmdirc.parser.irc.IRCParser.setAddLastLine(bool)


	/**
	 * Get the current socket State.
	 *
     * @since 0.6.3m1
	 * @return Current {@link SocketState}
	 */
	public SocketState getSocketState() { return currentSocketState; }
    //#IRCParser.java:360: method: SocketState com.dmdirc.parser.irc.IRCParser.getSocketState()
    //#input(SocketState getSocketState()): this
    //#input(SocketState getSocketState()): this.currentSocketState
    //#output(SocketState getSocketState()): return_value
    //#pre[2] (SocketState getSocketState()): init'ed(this.currentSocketState)
    //#post(SocketState getSocketState()): return_value == this.currentSocketState
    //#post(SocketState getSocketState()): init'ed(return_value)
    //#IRCParser.java:360: end of method: SocketState com.dmdirc.parser.irc.IRCParser.getSocketState()

	/**
	 * Get a reference to the Processing Manager.
	 *
	 * @return Reference to the CallbackManager
	 */
	public ProcessingManager getProcessingManager() { return myProcessingManager;	}
    //#IRCParser.java:367: method: ProcessingManager com.dmdirc.parser.irc.IRCParser.getProcessingManager()
    //#input(ProcessingManager getProcessingManager()): this
    //#input(ProcessingManager getProcessingManager()): this.myProcessingManager
    //#output(ProcessingManager getProcessingManager()): return_value
    //#pre[2] (ProcessingManager getProcessingManager()): init'ed(this.myProcessingManager)
    //#post(ProcessingManager getProcessingManager()): return_value == this.myProcessingManager
    //#post(ProcessingManager getProcessingManager()): init'ed(return_value)
    //#IRCParser.java:367: end of method: ProcessingManager com.dmdirc.parser.irc.IRCParser.getProcessingManager()

	/**
	 * Get a reference to the CallbackManager.
	 *
	 * @return Reference to the CallbackManager
	 */
	public CallbackManager getCallbackManager() { return myCallbackManager;	}
    //#IRCParser.java:374: method: CallbackManager com.dmdirc.parser.irc.IRCParser.getCallbackManager()
    //#input(CallbackManager getCallbackManager()): this
    //#input(CallbackManager getCallbackManager()): this.myCallbackManager
    //#output(CallbackManager getCallbackManager()): return_value
    //#pre[2] (CallbackManager getCallbackManager()): init'ed(this.myCallbackManager)
    //#post(CallbackManager getCallbackManager()): return_value == this.myCallbackManager
    //#post(CallbackManager getCallbackManager()): init'ed(return_value)
    //#IRCParser.java:374: end of method: CallbackManager com.dmdirc.parser.irc.IRCParser.getCallbackManager()

	/**
	 * Get a reference to the default TrustManager for SSL Sockets.
	 *
	 * @return a reference to trustAllCerts
	 */
	public TrustManager[] getDefaultTrustManager() { return trustAllCerts; }
    //#IRCParser.java:381: method: TrustManager[] com.dmdirc.parser.irc.IRCParser.getDefaultTrustManager()
    //#input(TrustManager[] getDefaultTrustManager()): this
    //#input(TrustManager[] getDefaultTrustManager()): this.trustAllCerts
    //#output(TrustManager[] getDefaultTrustManager()): return_value
    //#post(TrustManager[] getDefaultTrustManager()): return_value == this.trustAllCerts
    //#post(TrustManager[] getDefaultTrustManager()): init'ed(return_value)
    //#IRCParser.java:381: end of method: TrustManager[] com.dmdirc.parser.irc.IRCParser.getDefaultTrustManager()

	/**
	 * Get a reference to the current TrustManager for SSL Sockets.
	 *
	 * @return a reference to myTrustManager;
	 */
	public TrustManager[] getTrustManager() { return myTrustManager; }
    //#IRCParser.java:388: method: TrustManager[] com.dmdirc.parser.irc.IRCParser.getTrustManager()
    //#input(TrustManager[] getTrustManager()): this
    //#input(TrustManager[] getTrustManager()): this.myTrustManager
    //#output(TrustManager[] getTrustManager()): return_value
    //#pre[2] (TrustManager[] getTrustManager()): init'ed(this.myTrustManager)
    //#post(TrustManager[] getTrustManager()): return_value == this.myTrustManager
    //#post(TrustManager[] getTrustManager()): init'ed(return_value)
    //#IRCParser.java:388: end of method: TrustManager[] com.dmdirc.parser.irc.IRCParser.getTrustManager()

	/**
	 * Replace the current TrustManager for SSL Sockets with a new one.
	 *
	 * @param newTrustManager Replacement TrustManager for SSL Sockets.
	 */
	public void setTrustManager(final TrustManager[] newTrustManager) { myTrustManager = newTrustManager; }
    //#IRCParser.java:395: method: void com.dmdirc.parser.irc.IRCParser.setTrustManager(TrustManager[])
    //#input(void setTrustManager(TrustManager[])): newTrustManager
    //#input(void setTrustManager(TrustManager[])): this
    //#output(void setTrustManager(TrustManager[])): this.myTrustManager
    //#post(void setTrustManager(TrustManager[])): this.myTrustManager == newTrustManager
    //#post(void setTrustManager(TrustManager[])): init'ed(this.myTrustManager)
    //#IRCParser.java:395: end of method: void com.dmdirc.parser.irc.IRCParser.setTrustManager(TrustManager[])

	/**
	 * Replace the current KeyManagers for SSL Sockets with a new set.
	 *
	 * @param newKeyManagers Replacement KeyManagers for SSL Sockets.
	 */
	public void setKeyManagers(final KeyManager[] newKeyManagers) { myKeyManagers = newKeyManagers; }
    //#IRCParser.java:402: method: void com.dmdirc.parser.irc.IRCParser.setKeyManagers(KeyManager[])
    //#input(void setKeyManagers(KeyManager[])): newKeyManagers
    //#input(void setKeyManagers(KeyManager[])): this
    //#output(void setKeyManagers(KeyManager[])): this.myKeyManagers
    //#post(void setKeyManagers(KeyManager[])): this.myKeyManagers == newKeyManagers
    //#post(void setKeyManagers(KeyManager[])): init'ed(this.myKeyManagers)
    //#IRCParser.java:402: end of method: void com.dmdirc.parser.irc.IRCParser.setKeyManagers(KeyManager[])

	/**
	 * Get a reference to the ignorelist.
	 *
	 * @return a reference to the ignorelist
	 */
	public RegexStringList getIgnoreList() { return myIgnoreList; }
    //#IRCParser.java:409: method: RegexStringList com.dmdirc.parser.irc.IRCParser.getIgnoreList()
    //#input(RegexStringList getIgnoreList()): this
    //#input(RegexStringList getIgnoreList()): this.myIgnoreList
    //#output(RegexStringList getIgnoreList()): return_value
    //#pre[2] (RegexStringList getIgnoreList()): init'ed(this.myIgnoreList)
    //#post(RegexStringList getIgnoreList()): return_value == this.myIgnoreList
    //#post(RegexStringList getIgnoreList()): init'ed(return_value)
    //#IRCParser.java:409: end of method: RegexStringList com.dmdirc.parser.irc.IRCParser.getIgnoreList()

	/**
	 * Replaces the current ignorelist with a new one.
	 *
	 * @param ignoreList Replacement ignorelist
	 */
	public void setIgnoreList(final RegexStringList ignoreList) { myIgnoreList = ignoreList; }
    //#IRCParser.java:416: method: void com.dmdirc.parser.irc.IRCParser.setIgnoreList(RegexStringList)
    //#input(void setIgnoreList(RegexStringList)): ignoreList
    //#input(void setIgnoreList(RegexStringList)): this
    //#output(void setIgnoreList(RegexStringList)): this.myIgnoreList
    //#post(void setIgnoreList(RegexStringList)): this.myIgnoreList == ignoreList
    //#post(void setIgnoreList(RegexStringList)): init'ed(this.myIgnoreList)
    //#IRCParser.java:416: end of method: void com.dmdirc.parser.irc.IRCParser.setIgnoreList(RegexStringList)

	//---------------------------------------------------------------------------
	// Start Callbacks
	//---------------------------------------------------------------------------

	/**
	 * Callback to all objects implementing the ServerError Callback.
	 *
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.IServerError
	 * @param message The error message
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callServerError(final String message) {
		return myCallbackManager.getCallbackType("OnServerError").call(message);
    //#IRCParser.java:430: method: bool com.dmdirc.parser.irc.IRCParser.callServerError(String)
    //#IRCParser.java:430: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callServerError(String)
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:430: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callServerError(String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:430: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callServerError(String)
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:430: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callServerError(String)
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callServerError(String)): "Callback not found: "._tainted
    //#input(bool callServerError(String)): "OnServerError"._tainted
    //#input(bool callServerError(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callServerError(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callServerError(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callServerError(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callServerError(String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callServerError(String)): message
    //#input(bool callServerError(String)): this
    //#input(bool callServerError(String)): this.myCallbackManager
    //#input(bool callServerError(String)): this.myCallbackManager.callbackHash
    //#output(bool callServerError(String)): return_value
    //#pre[3] (bool callServerError(String)): this.myCallbackManager != null
    //#pre[4] (bool callServerError(String)): this.myCallbackManager.callbackHash != null
    //#post(bool callServerError(String)): init'ed(return_value)
    //#unanalyzed(bool callServerError(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callServerError(String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callServerError(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callServerError(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callServerError(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callServerError(String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callServerError(String)): Effects-of-calling:java.util.Map:get
    //#IRCParser.java:430: end of method: bool com.dmdirc.parser.irc.IRCParser.callServerError(String)
	}

	/**
	 * Callback to all objects implementing the DataIn Callback.
	 *
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.IDataIn
	 * @param data Incomming Line.
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callDataIn(final String data) {
		return myCallbackManager.getCallbackType("OnDataIn").call(data);
    //#IRCParser.java:441: method: bool com.dmdirc.parser.irc.IRCParser.callDataIn(String)
    //#IRCParser.java:441: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callDataIn(String)
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:441: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callDataIn(String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:441: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callDataIn(String)
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:441: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callDataIn(String)
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callDataIn(String)): "Callback not found: "._tainted
    //#input(bool callDataIn(String)): "OnDataIn"._tainted
    //#input(bool callDataIn(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callDataIn(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callDataIn(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callDataIn(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callDataIn(String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callDataIn(String)): data
    //#input(bool callDataIn(String)): this
    //#input(bool callDataIn(String)): this.myCallbackManager
    //#input(bool callDataIn(String)): this.myCallbackManager.callbackHash
    //#output(bool callDataIn(String)): return_value
    //#pre[3] (bool callDataIn(String)): this.myCallbackManager != null
    //#pre[4] (bool callDataIn(String)): this.myCallbackManager.callbackHash != null
    //#post(bool callDataIn(String)): init'ed(return_value)
    //#unanalyzed(bool callDataIn(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callDataIn(String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callDataIn(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callDataIn(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callDataIn(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callDataIn(String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callDataIn(String)): Effects-of-calling:java.util.Map:get
    //#IRCParser.java:441: end of method: bool com.dmdirc.parser.irc.IRCParser.callDataIn(String)
	}

	/**
	 * Callback to all objects implementing the DataOut Callback.
	 *
	 * @param data Outgoing Data
	 * @param fromParser True if parser sent the data, false if sent using .sendLine
	 * @return true if a method was called, false otherwise
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.IDataOut
	 */
	protected boolean callDataOut(final String data, final boolean fromParser) {
		return myCallbackManager.getCallbackType("OnDataOut").call(data, fromParser);
    //#IRCParser.java:453: method: bool com.dmdirc.parser.irc.IRCParser.callDataOut(String, bool)
    //#IRCParser.java:453: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callDataOut(String, bool)
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:453: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callDataOut(String, bool)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:453: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callDataOut(String, bool)
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:453: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callDataOut(String, bool)
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callDataOut(String, bool)): "Callback not found: "._tainted
    //#input(bool callDataOut(String, bool)): "OnDataOut"._tainted
    //#input(bool callDataOut(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callDataOut(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callDataOut(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callDataOut(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callDataOut(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callDataOut(String, bool)): data
    //#input(bool callDataOut(String, bool)): fromParser
    //#input(bool callDataOut(String, bool)): this
    //#input(bool callDataOut(String, bool)): this.myCallbackManager
    //#input(bool callDataOut(String, bool)): this.myCallbackManager.callbackHash
    //#output(bool callDataOut(String, bool)): return_value
    //#pre[4] (bool callDataOut(String, bool)): this.myCallbackManager != null
    //#pre[5] (bool callDataOut(String, bool)): this.myCallbackManager.callbackHash != null
    //#post(bool callDataOut(String, bool)): init'ed(return_value)
    //#unanalyzed(bool callDataOut(String, bool)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callDataOut(String, bool)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callDataOut(String, bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callDataOut(String, bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callDataOut(String, bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callDataOut(String, bool)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callDataOut(String, bool)): Effects-of-calling:java.util.Map:get
    //#IRCParser.java:453: end of method: bool com.dmdirc.parser.irc.IRCParser.callDataOut(String, bool)
	}

	/**
	 * Callback to all objects implementing the DebugInfo Callback.
	 *
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.IDebugInfo
	 * @param level Debugging Level (DEBUG_INFO, DEBUG_SOCKET etc)
	 * @param data Debugging Information as a format string
	 * @param args Formatting String Options
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callDebugInfo(final int level, final String data, final Object... args) {
		return callDebugInfo(level, String.format(data, args));
    //#IRCParser.java:466: method: bool com.dmdirc.parser.irc.IRCParser.callDebugInfo(int, String, Object[])
    //#input(bool callDebugInfo(int, String, Object[])): "Callback not found: "._tainted
    //#input(bool callDebugInfo(int, String, Object[])): "OnDebugInfo"._tainted
    //#input(bool callDebugInfo(int, String, Object[])): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(bool callDebugInfo(int, String, Object[])): __Descendant_Table[others]
    //#input(bool callDebugInfo(int, String, Object[])): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(bool callDebugInfo(int, String, Object[])): args
    //#input(bool callDebugInfo(int, String, Object[])): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callDebugInfo(int, String, Object[])): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callDebugInfo(int, String, Object[])): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callDebugInfo(int, String, Object[])): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callDebugInfo(int, String, Object[])): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callDebugInfo(int, String, Object[])): data
    //#input(bool callDebugInfo(int, String, Object[])): level
    //#input(bool callDebugInfo(int, String, Object[])): this
    //#input(bool callDebugInfo(int, String, Object[])): this.__Tag
    //#input(bool callDebugInfo(int, String, Object[])): this.myCallbackManager
    //#input(bool callDebugInfo(int, String, Object[])): this.myCallbackManager.callbackHash
    //#output(bool callDebugInfo(int, String, Object[])): return_value
    //#pre[5] (bool callDebugInfo(int, String, Object[])): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[6] (bool callDebugInfo(int, String, Object[])): this.myCallbackManager != null
    //#pre[7] (bool callDebugInfo(int, String, Object[])): this.myCallbackManager.callbackHash != null
    //#post(bool callDebugInfo(int, String, Object[])): init'ed(return_value)
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:call
    //#unanalyzed(bool callDebugInfo(int, String, Object[])): Effects-of-calling:java.lang.Integer:valueOf
    //#IRCParser.java:466: end of method: bool com.dmdirc.parser.irc.IRCParser.callDebugInfo(int, String, Object[])
	}
	/**
	 * Callback to all objects implementing the DebugInfo Callback.
	 *
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.IDebugInfo
	 * @param level Debugging Level (DEBUG_INFO, DEBUG_SOCKET etc)
	 * @param data Debugging Information
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callDebugInfo(final int level, final String data) {
		return myCallbackManager.getCallbackType("OnDebugInfo").call(level, data);
    //#IRCParser.java:477: method: bool com.dmdirc.parser.irc.IRCParser.callDebugInfo(int, String)
    //#IRCParser.java:477: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callDebugInfo(int, String)
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:477: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callDebugInfo(int, String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:477: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callDebugInfo(int, String)
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:477: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callDebugInfo(int, String)
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callDebugInfo(int, String)): "Callback not found: "._tainted
    //#input(bool callDebugInfo(int, String)): "OnDebugInfo"._tainted
    //#input(bool callDebugInfo(int, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callDebugInfo(int, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callDebugInfo(int, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callDebugInfo(int, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callDebugInfo(int, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callDebugInfo(int, String)): data
    //#input(bool callDebugInfo(int, String)): level
    //#input(bool callDebugInfo(int, String)): this
    //#input(bool callDebugInfo(int, String)): this.myCallbackManager
    //#input(bool callDebugInfo(int, String)): this.myCallbackManager.callbackHash
    //#output(bool callDebugInfo(int, String)): return_value
    //#pre[4] (bool callDebugInfo(int, String)): this.myCallbackManager != null
    //#pre[5] (bool callDebugInfo(int, String)): this.myCallbackManager.callbackHash != null
    //#post(bool callDebugInfo(int, String)): init'ed(return_value)
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callDebugInfo(int, String)): Effects-of-calling:java.util.Map:get
    //#IRCParser.java:477: end of method: bool com.dmdirc.parser.irc.IRCParser.callDebugInfo(int, String)
	}

	/**
	 * Callback to all objects implementing the IErrorInfo Interface.
	 *
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.IErrorInfo
	 * @param errorInfo ParserError object representing the error.
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callErrorInfo(final ParserError errorInfo) {
		return myCallbackManager.getCallbackType("OnErrorInfo").call(errorInfo);
    //#IRCParser.java:488: method: bool com.dmdirc.parser.irc.IRCParser.callErrorInfo(ParserError)
    //#IRCParser.java:488: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callErrorInfo(ParserError)
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:488: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callErrorInfo(ParserError)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:488: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callErrorInfo(ParserError)
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:488: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callErrorInfo(ParserError)
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callErrorInfo(ParserError)): "Callback not found: "._tainted
    //#input(bool callErrorInfo(ParserError)): "OnErrorInfo"._tainted
    //#input(bool callErrorInfo(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callErrorInfo(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callErrorInfo(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callErrorInfo(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callErrorInfo(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callErrorInfo(ParserError)): errorInfo
    //#input(bool callErrorInfo(ParserError)): this
    //#input(bool callErrorInfo(ParserError)): this.myCallbackManager
    //#input(bool callErrorInfo(ParserError)): this.myCallbackManager.callbackHash
    //#output(bool callErrorInfo(ParserError)): return_value
    //#pre[3] (bool callErrorInfo(ParserError)): this.myCallbackManager != null
    //#pre[4] (bool callErrorInfo(ParserError)): this.myCallbackManager.callbackHash != null
    //#post(bool callErrorInfo(ParserError)): init'ed(return_value)
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callErrorInfo(ParserError)): Effects-of-calling:java.util.Map:get
    //#IRCParser.java:488: end of method: bool com.dmdirc.parser.irc.IRCParser.callErrorInfo(ParserError)
	}

	/**
	 * Callback to all objects implementing the IConnectError Interface.
	 *
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.IConnectError
	 * @param errorInfo ParserError object representing the error.
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callConnectError(final ParserError errorInfo) {
		return myCallbackManager.getCallbackType("OnConnectError").call(errorInfo);
    //#IRCParser.java:499: method: bool com.dmdirc.parser.irc.IRCParser.callConnectError(ParserError)
    //#IRCParser.java:499: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callConnectError(ParserError)
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:499: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callConnectError(ParserError)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:499: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callConnectError(ParserError)
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:499: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callConnectError(ParserError)
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callConnectError(ParserError)): "Callback not found: "._tainted
    //#input(bool callConnectError(ParserError)): "OnConnectError"._tainted
    //#input(bool callConnectError(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callConnectError(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callConnectError(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callConnectError(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callConnectError(ParserError)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callConnectError(ParserError)): errorInfo
    //#input(bool callConnectError(ParserError)): this
    //#input(bool callConnectError(ParserError)): this.myCallbackManager
    //#input(bool callConnectError(ParserError)): this.myCallbackManager.callbackHash
    //#output(bool callConnectError(ParserError)): return_value
    //#pre[3] (bool callConnectError(ParserError)): this.myCallbackManager != null
    //#pre[4] (bool callConnectError(ParserError)): this.myCallbackManager.callbackHash != null
    //#post(bool callConnectError(ParserError)): init'ed(return_value)
    //#unanalyzed(bool callConnectError(ParserError)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callConnectError(ParserError)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callConnectError(ParserError)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callConnectError(ParserError)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callConnectError(ParserError)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callConnectError(ParserError)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callConnectError(ParserError)): Effects-of-calling:java.util.Map:get
    //#IRCParser.java:499: end of method: bool com.dmdirc.parser.irc.IRCParser.callConnectError(ParserError)
	}

	/**
	 * Callback to all objects implementing the SocketClosed Callback.
	 *
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.ISocketClosed
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callSocketClosed() {
		return myCallbackManager.getCallbackType("OnSocketClosed").call();
    //#IRCParser.java:509: method: bool com.dmdirc.parser.irc.IRCParser.callSocketClosed()
    //#IRCParser.java:509: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callSocketClosed()
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:509: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callSocketClosed()
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:509: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callSocketClosed()
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:509: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callSocketClosed()
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callSocketClosed()): "Callback not found: "._tainted
    //#input(bool callSocketClosed()): "OnSocketClosed"._tainted
    //#input(bool callSocketClosed()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callSocketClosed()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callSocketClosed()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callSocketClosed()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callSocketClosed()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callSocketClosed()): this
    //#input(bool callSocketClosed()): this.myCallbackManager
    //#input(bool callSocketClosed()): this.myCallbackManager.callbackHash
    //#output(bool callSocketClosed()): return_value
    //#pre[2] (bool callSocketClosed()): this.myCallbackManager != null
    //#pre[3] (bool callSocketClosed()): this.myCallbackManager.callbackHash != null
    //#post(bool callSocketClosed()): init'ed(return_value)
    //#unanalyzed(bool callSocketClosed()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callSocketClosed()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callSocketClosed()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callSocketClosed()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callSocketClosed()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callSocketClosed()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callSocketClosed()): Effects-of-calling:java.util.Map:get
    //#IRCParser.java:509: end of method: bool com.dmdirc.parser.irc.IRCParser.callSocketClosed()
	}

	/**
	 * Callback to all objects implementing the PingFailed Callback.
	 *
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.IPingFailed
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callPingFailed() {
		return myCallbackManager.getCallbackType("OnPingFailed").call();
    //#IRCParser.java:519: method: bool com.dmdirc.parser.irc.IRCParser.callPingFailed()
    //#IRCParser.java:519: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPingFailed()
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:519: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPingFailed()
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:519: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPingFailed()
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:519: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPingFailed()
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callPingFailed()): "Callback not found: "._tainted
    //#input(bool callPingFailed()): "OnPingFailed"._tainted
    //#input(bool callPingFailed()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callPingFailed()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callPingFailed()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callPingFailed()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callPingFailed()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callPingFailed()): this
    //#input(bool callPingFailed()): this.myCallbackManager
    //#input(bool callPingFailed()): this.myCallbackManager.callbackHash
    //#output(bool callPingFailed()): return_value
    //#pre[2] (bool callPingFailed()): this.myCallbackManager != null
    //#pre[3] (bool callPingFailed()): this.myCallbackManager.callbackHash != null
    //#post(bool callPingFailed()): init'ed(return_value)
    //#unanalyzed(bool callPingFailed()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callPingFailed()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callPingFailed()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callPingFailed()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callPingFailed()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callPingFailed()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callPingFailed()): Effects-of-calling:java.util.Map:get
    //#IRCParser.java:519: end of method: bool com.dmdirc.parser.irc.IRCParser.callPingFailed()
	}

	/**
	 * Callback to all objects implementing the PingSent Callback.
	 *
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.IPingSent
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callPingSent() {
		return myCallbackManager.getCallbackType("OnPingSent").call();
    //#IRCParser.java:529: method: bool com.dmdirc.parser.irc.IRCParser.callPingSent()
    //#IRCParser.java:529: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPingSent()
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:529: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPingSent()
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:529: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPingSent()
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:529: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPingSent()
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callPingSent()): "Callback not found: "._tainted
    //#input(bool callPingSent()): "OnPingSent"._tainted
    //#input(bool callPingSent()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callPingSent()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callPingSent()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callPingSent()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callPingSent()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callPingSent()): this
    //#input(bool callPingSent()): this.myCallbackManager
    //#input(bool callPingSent()): this.myCallbackManager.callbackHash
    //#output(bool callPingSent()): return_value
    //#pre[2] (bool callPingSent()): this.myCallbackManager != null
    //#pre[3] (bool callPingSent()): this.myCallbackManager.callbackHash != null
    //#post(bool callPingSent()): init'ed(return_value)
    //#unanalyzed(bool callPingSent()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callPingSent()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callPingSent()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callPingSent()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callPingSent()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callPingSent()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callPingSent()): Effects-of-calling:java.util.Map:get
    //#IRCParser.java:529: end of method: bool com.dmdirc.parser.irc.IRCParser.callPingSent()
	}

	/**
	 * Callback to all objects implementing the PingSuccess Callback.
	 *
	 * @see com.dmdirc.parser.irc.callbacks.interfaces.IPingSuccess
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callPingSuccess() {
		return myCallbackManager.getCallbackType("OnPingSuccess").call();
    //#IRCParser.java:539: method: bool com.dmdirc.parser.irc.IRCParser.callPingSuccess()
    //#IRCParser.java:539: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPingSuccess()
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:539: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPingSuccess()
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:539: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPingSuccess()
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:539: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPingSuccess()
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callPingSuccess()): "Callback not found: "._tainted
    //#input(bool callPingSuccess()): "OnPingSuccess"._tainted
    //#input(bool callPingSuccess()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callPingSuccess()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callPingSuccess()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callPingSuccess()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callPingSuccess()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callPingSuccess()): this
    //#input(bool callPingSuccess()): this.myCallbackManager
    //#input(bool callPingSuccess()): this.myCallbackManager.callbackHash
    //#output(bool callPingSuccess()): return_value
    //#pre[2] (bool callPingSuccess()): this.myCallbackManager != null
    //#pre[3] (bool callPingSuccess()): this.myCallbackManager.callbackHash != null
    //#post(bool callPingSuccess()): init'ed(return_value)
    //#unanalyzed(bool callPingSuccess()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callPingSuccess()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callPingSuccess()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callPingSuccess()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callPingSuccess()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callPingSuccess()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callPingSuccess()): Effects-of-calling:java.util.Map:get
    //#IRCParser.java:539: end of method: bool com.dmdirc.parser.irc.IRCParser.callPingSuccess()
	}

	/**
	 * Callback to all objects implementing the Post005 Callback.
	 *
	 * @return true if any callbacks were called.
	 * @see IPost005
	 */
	protected synchronized boolean callPost005() {
		if (post005) { return false; }
    //#IRCParser.java:549: method: bool com.dmdirc.parser.irc.IRCParser.callPost005()
    //#input(bool callPost005()): "Callback not found: "._tainted
    //#input(bool callPost005()): "OnPost005"._tainted
    //#input(bool callPost005()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(bool callPost005()): __Descendant_Table[others]
    //#input(bool callPost005()): __Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#input(bool callPost005()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callPost005()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callPost005()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callPost005()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callPost005()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callPost005()): this
    //#input(bool callPost005()): this.__Lock
    //#input(bool callPost005()): this.__Tag
    //#input(bool callPost005()): this.myCallbackManager
    //#input(bool callPost005()): this.myCallbackManager.callbackHash
    //#input(bool callPost005()): this.post005
    //#output(bool callPost005()): return_value
    //#output(bool callPost005()): this.post005
    //#pre[1] (bool callPost005()): init'ed(this.post005)
    //#pre[3] (bool callPost005()): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[4] (bool callPost005()): (soft) this.myCallbackManager != null
    //#pre[5] (bool callPost005()): (soft) this.myCallbackManager.callbackHash != null
    //#post(bool callPost005()): init'ed(return_value)
    //#post(bool callPost005()): this.post005 == 1
    //#unanalyzed(bool callPost005()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callPost005()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callPost005()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callPost005()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callPost005()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callPost005()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callPost005()): Effects-of-calling:java.util.Map:get
    //#test_vector(bool callPost005()): this.post005: {0}, {1}
		post005 = true;

		return getCallbackManager().getCallbackType("OnPost005").call();
    //#IRCParser.java:552: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPost005()
    //#    basic block: bb_3
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:552: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPost005()
    //#    basic block: bb_3
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:552: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPost005()
    //#    basic block: bb_3
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:552: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: bool callPost005()
    //#    unanalyzed callee: bool call(Object[])
    //#IRCParser.java:552: end of method: bool com.dmdirc.parser.irc.IRCParser.callPost005()
	}

	//---------------------------------------------------------------------------
	// End Callbacks
	//---------------------------------------------------------------------------

	/** Reset internal state (use before connect). */
	private void resetState() {
		// Reset General State info
		triedAlt = false;
    //#IRCParser.java:562: method: void com.dmdirc.parser.irc.IRCParser.resetState()
    //#input(void resetState()): "myself"._tainted
    //#input(void resetState()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void resetState()): __Descendant_Table[others]
    //#input(void resetState()): __Dispatch_Table.updateCharArrays(B)V
    //#input(void resetState()): com/dmdirc/parser/irc/SocketState.CLOSED
    //#input(void resetState()): this
    //#input(void resetState()): this.__Tag
    //#input(void resetState()): this.h005Info
    //#input(void resetState()): this.hChanModesBool
    //#input(void resetState()): this.hChanModesOther
    //#input(void resetState()): this.hChanPrefix
    //#input(void resetState()): this.hChannelList
    //#input(void resetState()): this.hClientList
    //#input(void resetState()): this.hPrefixMap
    //#input(void resetState()): this.hPrefixModes
    //#input(void resetState()): this.hUserModes
    //#input(void resetState()): this.pingTimer
    //#input(void resetState()): this.pingTimerSem
    //#output(void resetState()): new ClientInfo(resetState#1) num objects
    //#output(void resetState()): this.cMyself.__Tag
    //#output(void resetState()): this.cMyself.bIsFake
    //#output(void resetState()): this.cMyself.lModeQueue
    //#output(void resetState()): this.cMyself.myAwayReason
    //#output(void resetState()): this.cMyself.myChannelClientInfos
    //#output(void resetState()): this.cMyself.myMap
    //#output(void resetState()): this.cMyself.myParser
    //#output(void resetState()): this.cMyself.sHost
    //#output(void resetState()): this.cMyself.sIdent
    //#output(void resetState()): this.cMyself.sNickname
    //#output(void resetState()): this.cMyself.sRealName
    //#output(void resetState()): new HashMap(ClientInfo#3) num objects
    //#output(void resetState()): new Hashtable(ClientInfo#1) num objects
    //#output(void resetState()): new IRCStringConverter(updateCharArrays#1) num objects
    //#output(void resetState()): new IRCStringConverter(updateCharArrays#1).__Tag
    //#output(void resetState()): new IRCStringConverter(updateCharArrays#1).limit
    //#output(void resetState()): new IRCStringConverter(updateCharArrays#1).lowercase
    //#output(void resetState()): new IRCStringConverter(updateCharArrays#1).uppercase
    //#output(void resetState()): new LinkedList(ClientInfo#2) num objects
    //#output(void resetState()): new char[](IRCStringConverter#1) num objects
    //#output(void resetState()): new char[](IRCStringConverter#1).length
    //#output(void resetState()): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void resetState()): new char[](IRCStringConverter#2) num objects
    //#output(void resetState()): new char[](IRCStringConverter#2).length
    //#output(void resetState()): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void resetState()): this.cMyself
    //#output(void resetState()): this.currentSocketState
    //#output(void resetState()): this.got001
    //#output(void resetState()): this.lastLine
    //#output(void resetState()): this.nNextKeyCMBool
    //#output(void resetState()): this.nNextKeyPrefix
    //#output(void resetState()): this.nNextKeyUser
    //#output(void resetState()): this.pingTimer
    //#output(void resetState()): this.post005
    //#output(void resetState()): this.sNetworkName
    //#output(void resetState()): this.sServerName
    //#output(void resetState()): this.stringConverter
    //#output(void resetState()): this.triedAlt
    //#new obj(void resetState()): new ClientInfo(resetState#1)
    //#new obj(void resetState()): new HashMap(ClientInfo#3)
    //#new obj(void resetState()): new Hashtable(ClientInfo#1)
    //#new obj(void resetState()): new IRCStringConverter(updateCharArrays#1)
    //#new obj(void resetState()): new LinkedList(ClientInfo#2)
    //#new obj(void resetState()): new char[](IRCStringConverter#1)
    //#new obj(void resetState()): new char[](IRCStringConverter#2)
    //#pre[1] (void resetState()): init'ed(this.pingTimer)
    //#pre[3] (void resetState()): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[4] (void resetState()): this.h005Info != null
    //#pre[5] (void resetState()): this.hChanModesBool != null
    //#pre[6] (void resetState()): this.hChanModesOther != null
    //#pre[7] (void resetState()): this.hChanPrefix != null
    //#pre[8] (void resetState()): this.hChannelList != null
    //#pre[9] (void resetState()): this.hClientList != null
    //#pre[10] (void resetState()): this.hPrefixMap != null
    //#pre[11] (void resetState()): this.hPrefixModes != null
    //#pre[12] (void resetState()): this.hUserModes != null
    //#pre[13] (void resetState()): this.pingTimerSem != null
    //#post(void resetState()): this.cMyself == &new ClientInfo(resetState#1)
    //#post(void resetState()): this.currentSocketState == &com.dmdirc.parser.irc.SocketState__static_init.new SocketState(SocketState__static_init#2)
    //#post(void resetState()): this.got001 == 0
    //#post(void resetState()): this.post005 == 0
    //#post(void resetState()): this.triedAlt == 0
    //#post(void resetState()): this.lastLine == &""
    //#post(void resetState()): this.sNetworkName == &""
    //#post(void resetState()): this.sServerName == &""
    //#post(void resetState()): this.cMyself.myAwayReason == &""
    //#post(void resetState()): this.cMyself.sRealName == &""
    //#post(void resetState()): this.nNextKeyCMBool == 1
    //#post(void resetState()): this.nNextKeyPrefix == 1
    //#post(void resetState()): this.nNextKeyUser == 1
    //#post(void resetState()): new ClientInfo(resetState#1) num objects == 1
    //#post(void resetState()): this.cMyself.bIsFake == 1
    //#post(void resetState()): new HashMap(ClientInfo#3) num objects == 1
    //#post(void resetState()): new Hashtable(ClientInfo#1) num objects == 1
    //#post(void resetState()): new IRCStringConverter(updateCharArrays#1) num objects == 1
    //#post(void resetState()): new LinkedList(ClientInfo#2) num objects == 1
    //#post(void resetState()): new char[](IRCStringConverter#1) num objects == 1
    //#post(void resetState()): new char[](IRCStringConverter#2) num objects == 1
    //#post(void resetState()): this.pingTimer == null
    //#post(void resetState()): this.stringConverter == &new IRCStringConverter(updateCharArrays#1)
    //#post(void resetState()): this.cMyself.__Tag == com/dmdirc/parser/irc/ClientInfo
    //#post(void resetState()): this.cMyself.lModeQueue == &new LinkedList(ClientInfo#2)
    //#post(void resetState()): this.cMyself.myChannelClientInfos == &new Hashtable(ClientInfo#1)
    //#post(void resetState()): this.cMyself.myMap == &new HashMap(ClientInfo#3)
    //#post(void resetState()): this.cMyself.myParser == this
    //#post(void resetState()): this.cMyself.myParser != null
    //#post(void resetState()): this.cMyself.sHost == One-of{this.lastLine, undefined}
    //#post(void resetState()): this.cMyself.sHost in Addr_Set{null,&""}
    //#post(void resetState()): this.cMyself.sIdent == One-of{this.lastLine, undefined}
    //#post(void resetState()): this.cMyself.sIdent in Addr_Set{null,&""}
    //#post(void resetState()): this.cMyself.sNickname == undefined
    //#post(void resetState()): this.cMyself.sNickname == null
    //#post(void resetState()): new IRCStringConverter(updateCharArrays#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void resetState()): new IRCStringConverter(updateCharArrays#1).limit == 4
    //#post(void resetState()): new IRCStringConverter(updateCharArrays#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(void resetState()): new IRCStringConverter(updateCharArrays#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(void resetState()): new char[](IRCStringConverter#1).length == 127
    //#post(void resetState()): new char[](IRCStringConverter#2).length == 127
    //#post(void resetState()): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void resetState()): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void resetState()): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void resetState()): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void resetState()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void resetState()): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void resetState()): Effects-of-calling:java.util.Hashtable
    //#unanalyzed(void resetState()): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void resetState()): Effects-of-calling:java.util.HashMap
    //#test_vector(void resetState()): this.pingTimer: Addr_Set{null}, Inverse{null}
		got001 = false;
		post005 = false;
		// Clear the hash tables
		hChannelList.clear();
		hClientList.clear();
		h005Info.clear();
		hPrefixModes.clear();
		hPrefixMap.clear();
		hChanModesOther.clear();
		hChanModesBool.clear();
		hUserModes.clear();
		hChanPrefix.clear();
		// Reset the mode indexes
		nNextKeyPrefix = 1;
		nNextKeyCMBool = 1;
		nNextKeyUser = 1;
		sServerName = "";
		sNetworkName = "";
		lastLine = "";
		cMyself = new ClientInfo(this, "myself").setFake(true);

        pingTimerSem.acquireUninterruptibly();
		if (pingTimer != null) {
			pingTimer.cancel();
			pingTimer = null;
		}
        pingTimerSem.release();

		currentSocketState = SocketState.CLOSED;
		// Char Mapping
		updateCharArrays((byte)4);
	}
    //#IRCParser.java:594: end of method: void com.dmdirc.parser.irc.IRCParser.resetState()

	/**
	 * Called after other error callbacks.
	 * CallbackOnErrorInfo automatically calls this *AFTER* any registered callbacks
	 * for it are called.
	 *
	 * @param errorInfo ParserError object representing the error.
	 * @param called True/False depending on the the success of other callbacks.
	 */
	public void onPostErrorInfo(final ParserError errorInfo, final boolean called) {
		if (errorInfo.isFatal() && disconnectOnFatal) {
    //#IRCParser.java:605: method: void com.dmdirc.parser.irc.IRCParser.onPostErrorInfo(ParserError, bool)
    //#input(void onPostErrorInfo(ParserError, bool)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void onPostErrorInfo(ParserError, bool)): __Descendant_Table[others]
    //#input(void onPostErrorInfo(ParserError, bool)): __Dispatch_Table.disconnect(Ljava/lang/String;)V
    //#input(void onPostErrorInfo(ParserError, bool)): errorInfo
    //#input(void onPostErrorInfo(ParserError, bool)): errorInfo.errorLevel
    //#input(void onPostErrorInfo(ParserError, bool)): this
    //#input(void onPostErrorInfo(ParserError, bool)): this.__Tag
    //#input(void onPostErrorInfo(ParserError, bool)): this.disconnectOnFatal
    //#output(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(updateCharArrays#1) num objects
    //#output(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(updateCharArrays#1).__Tag
    //#output(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(updateCharArrays#1).limit
    //#output(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(updateCharArrays#1).lowercase
    //#output(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(updateCharArrays#1).uppercase
    //#output(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#1) num objects
    //#output(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#1).length
    //#output(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#2) num objects
    //#output(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#2).length
    //#output(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void onPostErrorInfo(ParserError, bool)): this.cMyself
    //#output(void onPostErrorInfo(ParserError, bool)): this.currentSocketState
    //#output(void onPostErrorInfo(ParserError, bool)): this.got001
    //#output(void onPostErrorInfo(ParserError, bool)): this.lastLine
    //#output(void onPostErrorInfo(ParserError, bool)): this.nNextKeyCMBool
    //#output(void onPostErrorInfo(ParserError, bool)): this.nNextKeyPrefix
    //#output(void onPostErrorInfo(ParserError, bool)): this.nNextKeyUser
    //#output(void onPostErrorInfo(ParserError, bool)): this.pingTimer
    //#output(void onPostErrorInfo(ParserError, bool)): this.post005
    //#output(void onPostErrorInfo(ParserError, bool)): this.sNetworkName
    //#output(void onPostErrorInfo(ParserError, bool)): this.sServerName
    //#output(void onPostErrorInfo(ParserError, bool)): this.stringConverter
    //#output(void onPostErrorInfo(ParserError, bool)): this.triedAlt
    //#new obj(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(updateCharArrays#1)
    //#new obj(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#1)
    //#new obj(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#2)
    //#pre[1] (void onPostErrorInfo(ParserError, bool)): errorInfo != null
    //#pre[2] (void onPostErrorInfo(ParserError, bool)): init'ed(errorInfo.errorLevel)
    //#pre[6] (void onPostErrorInfo(ParserError, bool)): (soft) init'ed(this.cMyself)
    //#pre[7] (void onPostErrorInfo(ParserError, bool)): (soft) init'ed(this.currentSocketState)
    //#pre[13] (void onPostErrorInfo(ParserError, bool)): (soft) init'ed(this.pingTimer)
    //#pre[17] (void onPostErrorInfo(ParserError, bool)): (soft) init'ed(this.stringConverter)
    //#pre[20] (void onPostErrorInfo(ParserError, bool)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[21] (void onPostErrorInfo(ParserError, bool)): (soft) init'ed(this.disconnectOnFatal)
    //#post(void onPostErrorInfo(ParserError, bool)): this.cMyself == old this.cMyself
    //#post(void onPostErrorInfo(ParserError, bool)): this.currentSocketState == old this.currentSocketState
    //#post(void onPostErrorInfo(ParserError, bool)): this.got001 == old this.got001
    //#post(void onPostErrorInfo(ParserError, bool)): this.lastLine == old this.lastLine
    //#post(void onPostErrorInfo(ParserError, bool)): this.nNextKeyCMBool == old this.nNextKeyCMBool
    //#post(void onPostErrorInfo(ParserError, bool)): this.nNextKeyPrefix == old this.nNextKeyPrefix
    //#post(void onPostErrorInfo(ParserError, bool)): this.nNextKeyUser == old this.nNextKeyUser
    //#post(void onPostErrorInfo(ParserError, bool)): this.pingTimer == old this.pingTimer
    //#post(void onPostErrorInfo(ParserError, bool)): this.post005 == old this.post005
    //#post(void onPostErrorInfo(ParserError, bool)): this.sNetworkName == old this.sNetworkName
    //#post(void onPostErrorInfo(ParserError, bool)): this.sServerName == old this.sServerName
    //#post(void onPostErrorInfo(ParserError, bool)): this.stringConverter == old this.stringConverter
    //#post(void onPostErrorInfo(ParserError, bool)): this.triedAlt == old this.triedAlt
    //#post(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects == undefined
    //#post(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects == 0, if init'ed
    //#post(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(getIRCStringConverter#1).__Tag == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(getIRCStringConverter#1).limit == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(updateCharArrays#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(updateCharArrays#1).__Tag == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(updateCharArrays#1).limit == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#1).length == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#1)[0..65_535] == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#2).length == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void onPostErrorInfo(ParserError, bool)): new char[](IRCStringConverter#2)[0..65_567] == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(getIRCStringConverter#1).lowercase == undefined
    //#post(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(getIRCStringConverter#1).lowercase == null
    //#post(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(getIRCStringConverter#1).uppercase == new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#post(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(updateCharArrays#1).lowercase == new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#post(void onPostErrorInfo(ParserError, bool)): new IRCStringConverter(updateCharArrays#1).uppercase == new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#test_vector(void onPostErrorInfo(ParserError, bool)): errorInfo.errorLevel mod 2: {0}, {1}
    //#test_vector(void onPostErrorInfo(ParserError, bool)): this.disconnectOnFatal: {0}, {1}
			disconnect("Fatal Parser Error");
    //#IRCParser.java:606: Warning: call too complex - analysis skipped
    //#    call on void disconnect(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void onPostErrorInfo(ParserError, bool)
    //#    unanalyzed callee: void disconnect(String)
		}
	}
    //#IRCParser.java:608: end of method: void com.dmdirc.parser.irc.IRCParser.onPostErrorInfo(ParserError, bool)

	/**
	 * Get the current Value of disconnectOnFatal.
	 *
	 * @return Value of disconnectOnFatal (true if the parser automatically disconnects on fatal errors, else false)
	 */
	public boolean getDisconnectOnFatal() { return disconnectOnFatal; }
    //#IRCParser.java:615: method: bool com.dmdirc.parser.irc.IRCParser.getDisconnectOnFatal()
    //#input(bool getDisconnectOnFatal()): this
    //#input(bool getDisconnectOnFatal()): this.disconnectOnFatal
    //#output(bool getDisconnectOnFatal()): return_value
    //#pre[2] (bool getDisconnectOnFatal()): init'ed(this.disconnectOnFatal)
    //#post(bool getDisconnectOnFatal()): return_value == this.disconnectOnFatal
    //#post(bool getDisconnectOnFatal()): init'ed(return_value)
    //#IRCParser.java:615: end of method: bool com.dmdirc.parser.irc.IRCParser.getDisconnectOnFatal()

	/**
	 * Set the current Value of disconnectOnFatal.
	 *
	 * @param newValue New value to set disconnectOnFatal
	 */
	public void setDisconnectOnFatal(final boolean newValue) { disconnectOnFatal = newValue; }
    //#IRCParser.java:622: method: void com.dmdirc.parser.irc.IRCParser.setDisconnectOnFatal(bool)
    //#input(void setDisconnectOnFatal(bool)): newValue
    //#input(void setDisconnectOnFatal(bool)): this
    //#output(void setDisconnectOnFatal(bool)): this.disconnectOnFatal
    //#post(void setDisconnectOnFatal(bool)): this.disconnectOnFatal == newValue
    //#post(void setDisconnectOnFatal(bool)): init'ed(this.disconnectOnFatal)
    //#IRCParser.java:622: end of method: void com.dmdirc.parser.irc.IRCParser.setDisconnectOnFatal(bool)

	/**
	 * Connect to IRC.
	 *
	 * @throws IOException if the socket can not be connected
	 * @throws UnknownHostException if the hostname can not be resolved
	 * @throws NoSuchAlgorithmException if SSL is not available
	 * @throws KeyManagementException if the trustManager is invalid
	 */
	private void connect() throws UnknownHostException, IOException, NoSuchAlgorithmException, KeyManagementException {
		resetState();
    //#IRCParser.java:633: method: void com.dmdirc.parser.irc.IRCParser.connect()
    //#input(void connect()): ") is invalid."._tainted
    //#input(void connect()): ":"._tainted
    //#input(void connect()): "Bind failed: "._tainted
    //#input(void connect()): "Binding failed: "._tainted
    //#input(void connect()): "Binding to IP: "._tainted
    //#input(void connect()): "Callback not found: "._tainted
    //#input(void connect()): "Connecting to "._tainted
    //#input(void connect()): "OnDebugInfo"._tainted
    //#input(void connect()): "Proxy port ("._tainted
    //#input(void connect()): "Server port ("._tainted
    //#input(void connect()): "myself"._tainted
    //#input(void connect()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void connect()): __Descendant_Table[others]
    //#input(void connect()): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void connect()): __Dispatch_Table.updateCharArrays(B)V
    //#input(void connect()): com/dmdirc/parser/irc/IRCAuthenticator.__Class_Obj.__Lock
    //#input(void connect()): com/dmdirc/parser/irc/IRCAuthenticator.__Descendant_Table[com/dmdirc/parser/irc/IRCAuthenticator]
    //#input(void connect()): com/dmdirc/parser/irc/IRCAuthenticator.__Descendant_Table[others]
    //#input(void connect()): com/dmdirc/parser/irc/IRCAuthenticator.__Dispatch_Table.addAuthentication(Lcom/dmdirc/parser/irc/ServerInfo;)V
    //#input(void connect()): com/dmdirc/parser/irc/IRCAuthenticator.__Dispatch_Table.addAuthentication(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
    //#input(void connect()): com/dmdirc/parser/irc/IRCAuthenticator.me
    //#input(void connect()): com/dmdirc/parser/irc/IRCAuthenticator.me.__Tag
    //#input(void connect()): com/dmdirc/parser/irc/IRCAuthenticator.me.replies
    //#input(void connect()): com/dmdirc/parser/irc/ServerInfo.__Descendant_Table[com/dmdirc/parser/irc/ServerInfo]
    //#input(void connect()): com/dmdirc/parser/irc/ServerInfo.__Descendant_Table[others]
    //#input(void connect()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getHost()Ljava/lang/String;
    //#input(void connect()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getPort()I
    //#input(void connect()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getProxyHost()Ljava/lang/String;
    //#input(void connect()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getProxyPass()Ljava/lang/String;
    //#input(void connect()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getProxyPort()I
    //#input(void connect()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getProxyUser()Ljava/lang/String;
    //#input(void connect()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getSSL()Z
    //#input(void connect()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getUseSocks()Z
    //#input(void connect()): com/dmdirc/parser/irc/SocketState.CLOSED
    //#input(void connect()): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void connect()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void connect()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void connect()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void connect()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void connect()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void connect()): java.net.Proxy$Type.SOCKS
    //#input(void connect()): this
    //#input(void connect()): this.__Tag
    //#input(void connect()): this.bindIP
    //#input(void connect()): this.bindIP._tainted
    //#input(void connect()): this.h005Info
    //#input(void connect()): this.hChanModesBool
    //#input(void connect()): this.hChanModesOther
    //#input(void connect()): this.hChanPrefix
    //#input(void connect()): this.hChannelList
    //#input(void connect()): this.hClientList
    //#input(void connect()): this.hPrefixMap
    //#input(void connect()): this.hPrefixModes
    //#input(void connect()): this.hUserModes
    //#input(void connect()): this.myCallbackManager
    //#input(void connect()): this.myCallbackManager.callbackHash
    //#input(void connect()): this.myKeyManagers
    //#input(void connect()): this.myTrustManager
    //#input(void connect()): this.pingTimer
    //#input(void connect()): this.pingTimerSem
    //#input(void connect()): this.server
    //#input(void connect()): this.server.__Tag
    //#input(void connect()): this.server.host
    //#input(void connect()): this.server.host._tainted
    //#input(void connect()): this.server.isSSL
    //#input(void connect()): this.server.port
    //#input(void connect()): this.server.proxyHost
    //#input(void connect()): this.server.proxyPass
    //#input(void connect()): this.server.proxyPort
    //#input(void connect()): this.server.proxyUser
    //#input(void connect()): this.server.useSocksProxy
    //#input(void connect()): this.socket
    //#input(void connect()): this.trustAllCerts
    //#output(void connect()): com/dmdirc/parser/irc/IRCAuthenticator.me
    //#output(void connect()): new BufferedReader(connect#19) num objects
    //#output(void connect()): new ClientInfo(resetState#1) num objects
    //#output(void connect()): new ClientInfo(resetState#1).__Tag
    //#output(void connect()): new ClientInfo(resetState#1).bIsFake
    //#output(void connect()): new ClientInfo(resetState#1).lModeQueue
    //#output(void connect()): new ClientInfo(resetState#1).myAwayReason
    //#output(void connect()): new ClientInfo(resetState#1).myChannelClientInfos
    //#output(void connect()): new ClientInfo(resetState#1).myMap
    //#output(void connect()): new ClientInfo(resetState#1).myParser
    //#output(void connect()): new ClientInfo(resetState#1).sHost
    //#output(void connect()): new ClientInfo(resetState#1).sIdent
    //#output(void connect()): new ClientInfo(resetState#1).sNickname
    //#output(void connect()): new ClientInfo(resetState#1).sRealName
    //#output(void connect()): new HashMap(ClientInfo#3) num objects
    //#output(void connect()): new HashMap(IRCAuthenticator#1) num objects
    //#output(void connect()): new Hashtable(ClientInfo#1) num objects
    //#output(void connect()): new IRCAuthenticator(getIRCAuthenticator#1) num objects
    //#output(void connect()): new IRCAuthenticator(getIRCAuthenticator#1).__Tag
    //#output(void connect()): new IRCAuthenticator(getIRCAuthenticator#1).replies
    //#output(void connect()): new IRCStringConverter(updateCharArrays#1) num objects
    //#output(void connect()): new IRCStringConverter(updateCharArrays#1).__Tag
    //#output(void connect()): new IRCStringConverter(updateCharArrays#1).limit
    //#output(void connect()): new IRCStringConverter(updateCharArrays#1).lowercase
    //#output(void connect()): new IRCStringConverter(updateCharArrays#1).uppercase
    //#output(void connect()): new LinkedList(ClientInfo#2) num objects
    //#output(void connect()): new PrintWriter(connect#18) num objects
    //#output(void connect()): new Socket(connect#10) num objects
    //#output(void connect()): new Socket(connect#6) num objects
    //#output(void connect()): new char[](IRCStringConverter#1) num objects
    //#output(void connect()): new char[](IRCStringConverter#1).length
    //#output(void connect()): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void connect()): new char[](IRCStringConverter#2) num objects
    //#output(void connect()): new char[](IRCStringConverter#2).length
    //#output(void connect()): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void connect()): this.cMyself
    //#output(void connect()): this.currentSocketState
    //#output(void connect()): this.got001
    //#output(void connect()): this.in
    //#output(void connect()): this.lastLine
    //#output(void connect()): this.myTrustManager
    //#output(void connect()): this.nNextKeyCMBool
    //#output(void connect()): this.nNextKeyPrefix
    //#output(void connect()): this.nNextKeyUser
    //#output(void connect()): this.out
    //#output(void connect()): this.pingTimer
    //#output(void connect()): this.post005
    //#output(void connect()): this.sNetworkName
    //#output(void connect()): this.sServerName
    //#output(void connect()): this.socket
    //#output(void connect()): this.stringConverter
    //#output(void connect()): this.triedAlt
    //#new obj(void connect()): new BufferedReader(connect#19)
    //#new obj(void connect()): new ClientInfo(resetState#1)
    //#new obj(void connect()): new HashMap(ClientInfo#3)
    //#new obj(void connect()): new HashMap(IRCAuthenticator#1)
    //#new obj(void connect()): new Hashtable(ClientInfo#1)
    //#new obj(void connect()): new IRCAuthenticator(getIRCAuthenticator#1)
    //#new obj(void connect()): new IRCStringConverter(updateCharArrays#1)
    //#new obj(void connect()): new LinkedList(ClientInfo#2)
    //#new obj(void connect()): new PrintWriter(connect#18)
    //#new obj(void connect()): new Socket(connect#10)
    //#new obj(void connect()): new Socket(connect#6)
    //#new obj(void connect()): new char[](IRCStringConverter#1)
    //#new obj(void connect()): new char[](IRCStringConverter#2)
    //#pre[5] (void connect()): init'ed(this.pingTimer)
    //#pre[8] (void connect()): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[11] (void connect()): this.h005Info != null
    //#pre[12] (void connect()): this.hChanModesBool != null
    //#pre[13] (void connect()): this.hChanModesOther != null
    //#pre[14] (void connect()): this.hChanPrefix != null
    //#pre[15] (void connect()): this.hChannelList != null
    //#pre[16] (void connect()): this.hClientList != null
    //#pre[17] (void connect()): this.hPrefixMap != null
    //#pre[18] (void connect()): this.hPrefixModes != null
    //#pre[19] (void connect()): this.hUserModes != null
    //#pre[20] (void connect()): this.myCallbackManager != null
    //#pre[21] (void connect()): this.myCallbackManager.callbackHash != null
    //#pre[23] (void connect()): this.pingTimerSem != null
    //#pre[24] (void connect()): this.server != null
    //#pre[25] (void connect()): this.server.__Tag == com/dmdirc/parser/irc/ServerInfo
    //#pre[26] (void connect()): init'ed(this.server.host)
    //#pre[28] (void connect()): init'ed(this.server.isSSL)
    //#pre[29] (void connect()): this.server.port in {1..65_535}
    //#pre[40] (void connect()): init'ed(this.server.useSocksProxy)
    //#pre[3] (void connect()): (soft) init'ed(com/dmdirc/parser/irc/IRCAuthenticator.me)
    //#pre[4] (void connect()): (soft) init'ed(this.myTrustManager)
    //#pre[6] (void connect()): (soft) this.socket != null
    //#pre[9] (void connect()): (soft) init'ed(this.bindIP)
    //#pre[22] (void connect()): (soft) init'ed(this.myKeyManagers)
    //#pre[36] (void connect()): (soft) this.server.proxyHost != null
    //#pre[37] (void connect()): (soft) init'ed(this.server.proxyPass)
    //#pre[38] (void connect()): (soft) this.server.proxyPort in {1..65_535}
    //#pre[39] (void connect()): (soft) init'ed(this.server.proxyUser)
    //#presumption(void connect()): getIRCAuthenticator(...).__Tag == com/dmdirc/parser/irc/IRCAuthenticator
    //#presumption(void connect()): getIRCAuthenticator(...).replies != null
    //#presumption(void connect()): init'ed(java.net.Proxy$Type.SOCKS)
    //#presumption(void connect()): javax.net.ssl.SSLContext:getInstance(...)@680 != null
    //#presumption(void connect()): javax.net.ssl.SSLContext:getSocketFactory(...)@683 != null
    //#presumption(void connect()): javax.net.ssl.SSLSocketFactory:createSocket(...)@685 != null
    //#presumption(void connect()): javax.net.ssl.SSLSocketFactory:createSocket(...)@688 != null
    //#presumption(void connect()): javax.net.ssl.SSLSocketFactory:createSocket(...)@692 != null
    //#presumption(void connect()): javax.net.ssl.SSLSocketFactory:createSocket(...)@695 != null
    //#post(void connect()): com/dmdirc/parser/irc/IRCAuthenticator.me == One-of{old com/dmdirc/parser/irc/IRCAuthenticator.me, &new IRCAuthenticator(getIRCAuthenticator#1)}
    //#post(void connect()): init'ed(com/dmdirc/parser/irc/IRCAuthenticator.me)
    //#post(void connect()): this.cMyself == &new ClientInfo(resetState#1)
    //#post(void connect()): this.currentSocketState in Addr_Set{&com.dmdirc.parser.irc.SocketState__static_init.new SocketState(SocketState__static_init#2),&com.dmdirc.parser.irc.SocketState__static_init.new SocketState(SocketState__static_init#3)}
    //#post(void connect()): this.got001 == 0
    //#post(void connect()): this.post005 == 0
    //#post(void connect()): this.triedAlt == 0
    //#post(void connect()): this.in == &new BufferedReader(connect#19)
    //#post(void connect()): this.lastLine == &""
    //#post(void connect()): this.sNetworkName == &""
    //#post(void connect()): this.sServerName == &""
    //#post(void connect()): new ClientInfo(resetState#1).myAwayReason == &""
    //#post(void connect()): new ClientInfo(resetState#1).sRealName == &""
    //#post(void connect()): this.myTrustManager == One-of{old this.myTrustManager, this.trustAllCerts}
    //#post(void connect()): init'ed(this.myTrustManager)
    //#post(void connect()): this.nNextKeyCMBool == 1
    //#post(void connect()): this.nNextKeyPrefix == 1
    //#post(void connect()): this.nNextKeyUser == 1
    //#post(void connect()): new ClientInfo(resetState#1) num objects == 1
    //#post(void connect()): new ClientInfo(resetState#1).bIsFake == 1
    //#post(void connect()): new HashMap(ClientInfo#3) num objects == 1
    //#post(void connect()): new Hashtable(ClientInfo#1) num objects == 1
    //#post(void connect()): new IRCStringConverter(updateCharArrays#1) num objects == 1
    //#post(void connect()): new LinkedList(ClientInfo#2) num objects == 1
    //#post(void connect()): new char[](IRCStringConverter#1) num objects == 1
    //#post(void connect()): new char[](IRCStringConverter#2) num objects == 1
    //#post(void connect()): this.out == &new PrintWriter(connect#18)
    //#post(void connect()): this.pingTimer == null
    //#post(void connect()): this.socket != null
    //#post(void connect()): this.stringConverter == &new IRCStringConverter(updateCharArrays#1)
    //#post(void connect()): new BufferedReader(connect#19) num objects == 1
    //#post(void connect()): new ClientInfo(resetState#1).__Tag == com/dmdirc/parser/irc/ClientInfo
    //#post(void connect()): new ClientInfo(resetState#1).lModeQueue == &new LinkedList(ClientInfo#2)
    //#post(void connect()): new ClientInfo(resetState#1).myChannelClientInfos == &new Hashtable(ClientInfo#1)
    //#post(void connect()): new ClientInfo(resetState#1).myMap == &new HashMap(ClientInfo#3)
    //#post(void connect()): new ClientInfo(resetState#1).myParser == this
    //#post(void connect()): new ClientInfo(resetState#1).myParser != null
    //#post(void connect()): new ClientInfo(resetState#1).sHost == One-of{this.lastLine, undefined}
    //#post(void connect()): new ClientInfo(resetState#1).sHost in Addr_Set{null,&""}
    //#post(void connect()): new ClientInfo(resetState#1).sIdent == One-of{this.lastLine, undefined}
    //#post(void connect()): new ClientInfo(resetState#1).sIdent in Addr_Set{null,&""}
    //#post(void connect()): init'ed(new ClientInfo(resetState#1).sNickname)
    //#post(void connect()): new HashMap(IRCAuthenticator#1) num objects <= 1
    //#post(void connect()): new IRCAuthenticator(getIRCAuthenticator#1) num objects <= 1
    //#post(void connect()): init'ed(new IRCAuthenticator(getIRCAuthenticator#1).__Tag)
    //#post(void connect()): init'ed(new IRCAuthenticator(getIRCAuthenticator#1).replies)
    //#post(void connect()): new IRCStringConverter(updateCharArrays#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void connect()): new IRCStringConverter(updateCharArrays#1).limit == 4
    //#post(void connect()): new IRCStringConverter(updateCharArrays#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(void connect()): new IRCStringConverter(updateCharArrays#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(void connect()): new PrintWriter(connect#18) num objects == 1
    //#post(void connect()): new Socket(connect#10) num objects <= 1
    //#post(void connect()): new Socket(connect#6) num objects <= 1
    //#post(void connect()): new char[](IRCStringConverter#1).length == 127
    //#post(void connect()): new char[](IRCStringConverter#2).length == 127
    //#post(void connect()): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void connect()): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void connect()): Effects-of-calling:java.util.concurrent.Semaphore:acquireUninterruptibly
    //#unanalyzed(void connect()): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void connect()): Effects-of-calling:java.util.concurrent.Semaphore:release
    //#unanalyzed(void connect()): Effects-of-calling:java.util.Map:clear
    //#unanalyzed(void connect()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void connect()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void connect()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void connect()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void connect()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void connect()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void connect()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void connect()): Effects-of-calling:call
    //#unanalyzed(void connect()): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo
    //#unanalyzed(void connect()): Effects-of-calling:setFake
    //#unanalyzed(void connect()): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void connect()): Effects-of-calling:java.net.Authenticator
    //#unanalyzed(void connect()): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void connect()): Effects-of-calling:java.net.Authenticator:setDefault
    //#unanalyzed(void connect()): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void connect()): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void connect()): Effects-of-calling:java.net.PasswordAuthentication
    //#unanalyzed(void connect()): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void connect()): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void connect()): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void connect()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void connect()): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void connect()): Effects-of-calling:java.util.Hashtable
    //#unanalyzed(void connect()): Effects-of-calling:java.util.LinkedList
    //#test_vector(void connect()): this.myTrustManager: Inverse{null}, Addr_Set{null}
    //#test_vector(void connect()): this.bindIP: Addr_Set{null}, Inverse{null}
    //#test_vector(void connect()): this.server.isSSL: {1}, {0}
    //#test_vector(void connect()): this.server.proxyUser: Addr_Set{null}, Inverse{null}
    //#test_vector(void connect()): this.server.useSocksProxy: {0}, {1}
    //#test_vector(void connect()): java.lang.String:isEmpty(...)@642: {1}, {0}
    //#test_vector(void connect()): java.lang.String:isEmpty(...)@652: {1}, {0}
    //#test_vector(void connect()): java.lang.String:isEmpty(...)@661: {1}, {0}
    //#test_vector(void connect()): java.lang.String:isEmpty(...)@687: {0}, {1}
		callDebugInfo(DEBUG_SOCKET, "Connecting to " + server.getHost() + ":" + server.getPort());

		if (server.getPort() > 65535 || server.getPort() <= 0) {
			throw new IOException("Server port ("+server.getPort()+") is invalid.");
		}

		if (server.getUseSocks()) {
			callDebugInfo(DEBUG_SOCKET, "Using Proxy");
			if (bindIP != null && !bindIP.isEmpty()) {
				callDebugInfo(DEBUG_SOCKET, "IP Binding is not possible when using a proxy.");
			}
			if (server.getProxyPort() > 65535 || server.getProxyPort() <= 0) {
				throw new IOException("Proxy port ("+server.getProxyPort()+") is invalid.");
			}

			final Proxy.Type proxyType = Proxy.Type.SOCKS;
			socket = new Socket(new Proxy(proxyType, new InetSocketAddress(server.getProxyHost(), server.getProxyPort())));
			currentSocketState = SocketState.OPEN;
			if (server.getProxyUser() != null && !server.getProxyUser().isEmpty()) {
				IRCAuthenticator.getIRCAuthenticator().addAuthentication(server);
			}
			socket.connect(new InetSocketAddress(server.getHost(), server.getPort()));
		} else {
			callDebugInfo(DEBUG_SOCKET, "Not using Proxy");
			if (!server.getSSL()) {
				socket = new Socket();

				if (bindIP != null && !bindIP.isEmpty()) {
					callDebugInfo(DEBUG_SOCKET, "Binding to IP: "+bindIP);
					try {
						socket.bind(new InetSocketAddress(InetAddress.getByName(bindIP), 0));
					} catch (IOException e) {
						callDebugInfo(DEBUG_SOCKET, "Binding failed: "+e.getMessage());
					}
				}

				currentSocketState = SocketState.OPEN;
				socket.connect(new InetSocketAddress(server.getHost(), server.getPort()));
			}
		}

		if (server.getSSL()) {
			callDebugInfo(DEBUG_SOCKET, "Server is SSL.");

			if (myTrustManager == null) { myTrustManager = trustAllCerts; }

			final SSLContext sc = SSLContext.getInstance("SSL");
			sc.init(myKeyManagers, myTrustManager, new java.security.SecureRandom());

			final SSLSocketFactory socketFactory = sc.getSocketFactory();
			if (server.getUseSocks()) {
				socket = socketFactory.createSocket(socket, server.getHost(), server.getPort(), false);
			} else {
				if (bindIP == null || bindIP.isEmpty()) {
					socket = socketFactory.createSocket(server.getHost(), server.getPort());
				} else {
					callDebugInfo(DEBUG_SOCKET, "Binding to IP: "+bindIP);
					try {
						socket = socketFactory.createSocket(server.getHost(), server.getPort(), InetAddress.getByName(bindIP), 0);
					} catch (UnknownHostException e) {
						callDebugInfo(DEBUG_SOCKET, "Bind failed: "+e.getMessage());
						socket = socketFactory.createSocket(server.getHost(), server.getPort());
					}
				}
			}

			currentSocketState = SocketState.OPEN;
		}

		callDebugInfo(DEBUG_SOCKET, "\t-> Opening socket output stream PrintWriter");
		out = new PrintWriter(socket.getOutputStream(), true);
		callDebugInfo(DEBUG_SOCKET, "\t-> Opening socket input stream BufferedReader");
		in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		callDebugInfo(DEBUG_SOCKET, "\t-> Socket Opened");
	}
    //#IRCParser.java:708: end of method: void com.dmdirc.parser.irc.IRCParser.connect()

	/**
	 * Send server connection strings (NICK/USER/PASS).
	 */
	protected void sendConnectionStrings() {
		if (!server.getPassword().isEmpty()) {
    //#IRCParser.java:714: method: void com.dmdirc.parser.irc.IRCParser.sendConnectionStrings()
    //#input(void sendConnectionStrings()): " "._tainted
    //#input(void sendConnectionStrings()): " :"._tainted
    //#input(void sendConnectionStrings()): " for mode "._tainted
    //#input(void sendConnectionStrings()): "*"._tainted
    //#input(void sendConnectionStrings()): "Callback not found: "._tainted
    //#input(void sendConnectionStrings()): "Intercepted mode request for "._tainted
    //#input(void sendConnectionStrings()): "NICK "._tainted
    //#input(void sendConnectionStrings()): "OnDataOut"._tainted
    //#input(void sendConnectionStrings()): "OnDebugInfo"._tainted
    //#input(void sendConnectionStrings()): "PASS "._tainted
    //#input(void sendConnectionStrings()): "USER "._tainted
    //#input(void sendConnectionStrings()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendConnectionStrings()): __Descendant_Table[others]
    //#input(void sendConnectionStrings()): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendConnectionStrings()): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendConnectionStrings()): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendConnectionStrings()): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendConnectionStrings()): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendConnectionStrings()): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendConnectionStrings()): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void sendConnectionStrings()): __Dispatch_Table.setNickname(Ljava/lang/String;)V
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/ServerInfo.__Descendant_Table[com/dmdirc/parser/irc/ServerInfo]
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/ServerInfo.__Descendant_Table[others]
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getHost()Ljava/lang/String;
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getPassword()Ljava/lang/String;
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendConnectionStrings()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendConnectionStrings()): this
    //#input(void sendConnectionStrings()): this.__Tag
    //#input(void sendConnectionStrings()): this.cMyself
    //#input(void sendConnectionStrings()): this.cMyself.bIsFake
    //#input(void sendConnectionStrings()): this.cMyself.sNickname
    //#input(void sendConnectionStrings()): this.currentSocketState
    //#input(void sendConnectionStrings()): this.hChanModesOther
    //#input(void sendConnectionStrings()): this.hChannelList
    //#input(void sendConnectionStrings()): this.me
    //#input(void sendConnectionStrings()): this.me.nickname
    //#input(void sendConnectionStrings()): this.me.nickname._tainted
    //#input(void sendConnectionStrings()): this.me.realname
    //#input(void sendConnectionStrings()): this.me.realname._tainted
    //#input(void sendConnectionStrings()): this.me.username
    //#input(void sendConnectionStrings()): this.me.username._tainted
    //#input(void sendConnectionStrings()): this.myCallbackManager
    //#input(void sendConnectionStrings()): this.myCallbackManager.callbackHash
    //#input(void sendConnectionStrings()): this.out
    //#input(void sendConnectionStrings()): this.server
    //#input(void sendConnectionStrings()): this.server.__Tag
    //#input(void sendConnectionStrings()): this.server.host
    //#input(void sendConnectionStrings()): this.server.host._tainted
    //#input(void sendConnectionStrings()): this.server.password
    //#input(void sendConnectionStrings()): this.server.password._tainted
    //#input(void sendConnectionStrings()): this.stringConverter
    //#input(void sendConnectionStrings()): this.stringConverter.__Tag
    //#input(void sendConnectionStrings()): this.stringConverter.lowercase
    //#input(void sendConnectionStrings()): this.stringConverter.lowercase.length
    //#output(void sendConnectionStrings()): java.lang.String:substring(...)._tainted
    //#output(void sendConnectionStrings()): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendConnectionStrings()): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendConnectionStrings()): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendConnectionStrings()): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendConnectionStrings()): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendConnectionStrings()): new char[](IRCStringConverter#1) num objects
    //#output(void sendConnectionStrings()): new char[](IRCStringConverter#1).length
    //#output(void sendConnectionStrings()): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendConnectionStrings()): new char[](IRCStringConverter#2) num objects
    //#output(void sendConnectionStrings()): new char[](IRCStringConverter#2).length
    //#output(void sendConnectionStrings()): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendConnectionStrings()): this.cMyself.myAwayReason
    //#output(void sendConnectionStrings()): this.me.nickname
    //#output(void sendConnectionStrings()): this.sThinkNickname
    //#output(void sendConnectionStrings()): this.stringConverter
    //#new obj(void sendConnectionStrings()): java.lang.String:substring(...)
    //#new obj(void sendConnectionStrings()): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendConnectionStrings()): new char[](IRCStringConverter#1)
    //#new obj(void sendConnectionStrings()): new char[](IRCStringConverter#2)
    //#pre[2] (void sendConnectionStrings()): init'ed(this.me.nickname)
    //#pre[6] (void sendConnectionStrings()): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[10] (void sendConnectionStrings()): init'ed(this.currentSocketState)
    //#pre[14] (void sendConnectionStrings()): this.me != null
    //#pre[16] (void sendConnectionStrings()): init'ed(this.me.realname)
    //#pre[18] (void sendConnectionStrings()): init'ed(this.me.username)
    //#pre[23] (void sendConnectionStrings()): this.server != null
    //#pre[24] (void sendConnectionStrings()): this.server.__Tag == com/dmdirc/parser/irc/ServerInfo
    //#pre[25] (void sendConnectionStrings()): init'ed(this.server.host)
    //#pre[27] (void sendConnectionStrings()): this.server.password != null
    //#pre[4] (void sendConnectionStrings()): (soft) init'ed(this.stringConverter)
    //#pre[7] (void sendConnectionStrings()): (soft) this.cMyself != null
    //#pre[8] (void sendConnectionStrings()): (soft) init'ed(this.cMyself.bIsFake)
    //#pre[9] (void sendConnectionStrings()): (soft) this.cMyself.sNickname != null
    //#pre[11] (void sendConnectionStrings()): (soft) this.hChanModesOther != null
    //#pre[12] (void sendConnectionStrings()): (soft) this.hChannelList != null
    //#pre[20] (void sendConnectionStrings()): (soft) this.myCallbackManager != null
    //#pre[21] (void sendConnectionStrings()): (soft) this.myCallbackManager.callbackHash != null
    //#pre[22] (void sendConnectionStrings()): (soft) init'ed(this.out)
    //#presumption(void sendConnectionStrings()): java.net.InetAddress:getLocalHost(...)@720 != null
    //#post(void sendConnectionStrings()): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendConnectionStrings()): possibly_updated(this.cMyself.myAwayReason)
    //#post(void sendConnectionStrings()): this.me.nickname == old this.me.nickname
    //#post(void sendConnectionStrings()): init'ed(this.me.nickname)
    //#post(void sendConnectionStrings()): this.sThinkNickname == One-of{old this.sThinkNickname, old this.me.nickname}
    //#post(void sendConnectionStrings()): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendConnectionStrings()): init'ed(this.stringConverter)
    //#post(void sendConnectionStrings()): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendConnectionStrings()): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void sendConnectionStrings()): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void sendConnectionStrings()): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendConnectionStrings()): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendConnectionStrings()): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendConnectionStrings()): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendConnectionStrings()): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void sendConnectionStrings()): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendConnectionStrings()): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendConnectionStrings()): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void sendConnectionStrings()): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendConnectionStrings()): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:isFake
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:getNickname
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:doSendString
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:call
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void sendConnectionStrings()): Effects-of-calling:java.lang.System:currentTimeMillis
    //#test_vector(void sendConnectionStrings()): java.lang.String:isEmpty(...)@714: {1}, {0}
			sendString("PASS " + server.getPassword());
		}
		setNickname(me.getNickname());
		String localhost;
		try {
			localhost = InetAddress.getLocalHost().getHostAddress();
		} catch (UnknownHostException uhe) {
			localhost = "*";
		}
		sendString("USER " + me.getUsername() + " "+localhost+" "+server.getHost()+" :" + me.getRealname());
	}
    //#IRCParser.java:725: end of method: void com.dmdirc.parser.irc.IRCParser.sendConnectionStrings()

	/**
	 * Handle an onConnect error.
	 *
	 * @param e Exception to handle
	 */
	private void handleConnectException(final Exception e) {
		callDebugInfo(DEBUG_SOCKET, "Error Connecting (" + e.getMessage() + "), Aborted");
    //#IRCParser.java:733: method: void com.dmdirc.parser.irc.IRCParser.handleConnectException(Exception)
    //#input(void handleConnectException(Exception)): "), Aborted"._tainted
    //#input(void handleConnectException(Exception)): "Callback not found: "._tainted
    //#input(void handleConnectException(Exception)): "Error Connecting ("._tainted
    //#input(void handleConnectException(Exception)): "OnConnectError"._tainted
    //#input(void handleConnectException(Exception)): "OnDebugInfo"._tainted
    //#input(void handleConnectException(Exception)): "OnSocketClosed"._tainted
    //#input(void handleConnectException(Exception)): "myself"._tainted
    //#input(void handleConnectException(Exception)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void handleConnectException(Exception)): __Descendant_Table[others]
    //#input(void handleConnectException(Exception)): __Dispatch_Table.callConnectError(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#input(void handleConnectException(Exception)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void handleConnectException(Exception)): __Dispatch_Table.callSocketClosed()Z
    //#input(void handleConnectException(Exception)): __Dispatch_Table.getLastLine()Ljava/lang/String;
    //#input(void handleConnectException(Exception)): __Dispatch_Table.updateCharArrays(B)V
    //#input(void handleConnectException(Exception)): com/dmdirc/parser/irc/SocketState.CLOSED
    //#input(void handleConnectException(Exception)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void handleConnectException(Exception)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void handleConnectException(Exception)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void handleConnectException(Exception)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void handleConnectException(Exception)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void handleConnectException(Exception)): e
    //#input(void handleConnectException(Exception)): this
    //#input(void handleConnectException(Exception)): this.__Tag
    //#input(void handleConnectException(Exception)): this.currentSocketState
    //#input(void handleConnectException(Exception)): this.h005Info
    //#input(void handleConnectException(Exception)): this.hChanModesBool
    //#input(void handleConnectException(Exception)): this.hChanModesOther
    //#input(void handleConnectException(Exception)): this.hChanPrefix
    //#input(void handleConnectException(Exception)): this.hChannelList
    //#input(void handleConnectException(Exception)): this.hClientList
    //#input(void handleConnectException(Exception)): this.hPrefixMap
    //#input(void handleConnectException(Exception)): this.hPrefixModes
    //#input(void handleConnectException(Exception)): this.hUserModes
    //#input(void handleConnectException(Exception)): this.lastLine
    //#input(void handleConnectException(Exception)): this.myCallbackManager
    //#input(void handleConnectException(Exception)): this.myCallbackManager.callbackHash
    //#input(void handleConnectException(Exception)): this.pingTimer
    //#input(void handleConnectException(Exception)): this.pingTimerSem
    //#output(void handleConnectException(Exception)): new ClientInfo(resetState#1) num objects
    //#output(void handleConnectException(Exception)): this.cMyself.__Tag
    //#output(void handleConnectException(Exception)): this.cMyself.bIsFake
    //#output(void handleConnectException(Exception)): this.cMyself.lModeQueue
    //#output(void handleConnectException(Exception)): this.cMyself.myAwayReason
    //#output(void handleConnectException(Exception)): this.cMyself.myChannelClientInfos
    //#output(void handleConnectException(Exception)): this.cMyself.myMap
    //#output(void handleConnectException(Exception)): this.cMyself.myParser
    //#output(void handleConnectException(Exception)): this.cMyself.sHost
    //#output(void handleConnectException(Exception)): this.cMyself.sIdent
    //#output(void handleConnectException(Exception)): this.cMyself.sNickname
    //#output(void handleConnectException(Exception)): this.cMyself.sRealName
    //#output(void handleConnectException(Exception)): new HashMap(ClientInfo#3) num objects
    //#output(void handleConnectException(Exception)): new Hashtable(ClientInfo#1) num objects
    //#output(void handleConnectException(Exception)): new IRCStringConverter(updateCharArrays#1) num objects
    //#output(void handleConnectException(Exception)): this.stringConverter.__Tag
    //#output(void handleConnectException(Exception)): this.stringConverter.limit
    //#output(void handleConnectException(Exception)): this.stringConverter.lowercase
    //#output(void handleConnectException(Exception)): this.stringConverter.uppercase
    //#output(void handleConnectException(Exception)): new LinkedList(ClientInfo#2) num objects
    //#output(void handleConnectException(Exception)): new char[](IRCStringConverter#1) num objects
    //#output(void handleConnectException(Exception)): this.stringConverter.lowercase.length
    //#output(void handleConnectException(Exception)): this.stringConverter.lowercase[0..65_535]
    //#output(void handleConnectException(Exception)): new char[](IRCStringConverter#2) num objects
    //#output(void handleConnectException(Exception)): this.stringConverter.uppercase.length
    //#output(void handleConnectException(Exception)): this.stringConverter.uppercase[0..65_567]
    //#output(void handleConnectException(Exception)): this.cMyself
    //#output(void handleConnectException(Exception)): this.currentSocketState
    //#output(void handleConnectException(Exception)): this.got001
    //#output(void handleConnectException(Exception)): this.lastLine
    //#output(void handleConnectException(Exception)): this.nNextKeyCMBool
    //#output(void handleConnectException(Exception)): this.nNextKeyPrefix
    //#output(void handleConnectException(Exception)): this.nNextKeyUser
    //#output(void handleConnectException(Exception)): this.pingTimer
    //#output(void handleConnectException(Exception)): this.post005
    //#output(void handleConnectException(Exception)): this.sNetworkName
    //#output(void handleConnectException(Exception)): this.sServerName
    //#output(void handleConnectException(Exception)): this.stringConverter
    //#output(void handleConnectException(Exception)): this.triedAlt
    //#new obj(void handleConnectException(Exception)): new ClientInfo(resetState#1)
    //#new obj(void handleConnectException(Exception)): new HashMap(ClientInfo#3)
    //#new obj(void handleConnectException(Exception)): new Hashtable(ClientInfo#1)
    //#new obj(void handleConnectException(Exception)): new IRCStringConverter(updateCharArrays#1)
    //#new obj(void handleConnectException(Exception)): new LinkedList(ClientInfo#2)
    //#new obj(void handleConnectException(Exception)): new char[](IRCStringConverter#1)
    //#new obj(void handleConnectException(Exception)): new char[](IRCStringConverter#2)
    //#pre[1] (void handleConnectException(Exception)): e != null
    //#pre[2] (void handleConnectException(Exception)): init'ed(this.currentSocketState)
    //#pre[3] (void handleConnectException(Exception)): init'ed(this.lastLine)
    //#pre[4] (void handleConnectException(Exception)): init'ed(this.pingTimer)
    //#pre[6] (void handleConnectException(Exception)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[7] (void handleConnectException(Exception)): this.h005Info != null
    //#pre[8] (void handleConnectException(Exception)): this.hChanModesBool != null
    //#pre[9] (void handleConnectException(Exception)): this.hChanModesOther != null
    //#pre[10] (void handleConnectException(Exception)): this.hChanPrefix != null
    //#pre[11] (void handleConnectException(Exception)): this.hChannelList != null
    //#pre[12] (void handleConnectException(Exception)): this.hClientList != null
    //#pre[13] (void handleConnectException(Exception)): this.hPrefixMap != null
    //#pre[14] (void handleConnectException(Exception)): this.hPrefixModes != null
    //#pre[15] (void handleConnectException(Exception)): this.hUserModes != null
    //#pre[16] (void handleConnectException(Exception)): this.myCallbackManager != null
    //#pre[17] (void handleConnectException(Exception)): this.myCallbackManager.callbackHash != null
    //#pre[18] (void handleConnectException(Exception)): this.pingTimerSem != null
    //#post(void handleConnectException(Exception)): this.cMyself == &new ClientInfo(resetState#1)
    //#post(void handleConnectException(Exception)): this.currentSocketState == &com.dmdirc.parser.irc.SocketState__static_init.new SocketState(SocketState__static_init#2)
    //#post(void handleConnectException(Exception)): this.got001 == 0
    //#post(void handleConnectException(Exception)): this.post005 == 0
    //#post(void handleConnectException(Exception)): this.triedAlt == 0
    //#post(void handleConnectException(Exception)): this.lastLine == &""
    //#post(void handleConnectException(Exception)): this.sNetworkName == &""
    //#post(void handleConnectException(Exception)): this.sServerName == &""
    //#post(void handleConnectException(Exception)): this.cMyself.myAwayReason == &""
    //#post(void handleConnectException(Exception)): this.cMyself.sRealName == &""
    //#post(void handleConnectException(Exception)): this.nNextKeyCMBool == 1
    //#post(void handleConnectException(Exception)): this.nNextKeyPrefix == 1
    //#post(void handleConnectException(Exception)): this.nNextKeyUser == 1
    //#post(void handleConnectException(Exception)): new ClientInfo(resetState#1) num objects == 1
    //#post(void handleConnectException(Exception)): this.cMyself.bIsFake == 1
    //#post(void handleConnectException(Exception)): new HashMap(ClientInfo#3) num objects == 1
    //#post(void handleConnectException(Exception)): new Hashtable(ClientInfo#1) num objects == 1
    //#post(void handleConnectException(Exception)): new IRCStringConverter(updateCharArrays#1) num objects == 1
    //#post(void handleConnectException(Exception)): new LinkedList(ClientInfo#2) num objects == 1
    //#post(void handleConnectException(Exception)): new char[](IRCStringConverter#1) num objects == 1
    //#post(void handleConnectException(Exception)): new char[](IRCStringConverter#2) num objects == 1
    //#post(void handleConnectException(Exception)): this.pingTimer == null
    //#post(void handleConnectException(Exception)): this.stringConverter == &new IRCStringConverter(updateCharArrays#1)
    //#post(void handleConnectException(Exception)): this.cMyself.__Tag == com/dmdirc/parser/irc/ClientInfo
    //#post(void handleConnectException(Exception)): this.cMyself.lModeQueue == &new LinkedList(ClientInfo#2)
    //#post(void handleConnectException(Exception)): this.cMyself.myChannelClientInfos == &new Hashtable(ClientInfo#1)
    //#post(void handleConnectException(Exception)): this.cMyself.myMap == &new HashMap(ClientInfo#3)
    //#post(void handleConnectException(Exception)): this.cMyself.myParser == this
    //#post(void handleConnectException(Exception)): this.cMyself.myParser != null
    //#post(void handleConnectException(Exception)): this.cMyself.sHost == One-of{this.lastLine, undefined}
    //#post(void handleConnectException(Exception)): this.cMyself.sHost in Addr_Set{null,&""}
    //#post(void handleConnectException(Exception)): this.cMyself.sIdent == One-of{this.lastLine, undefined}
    //#post(void handleConnectException(Exception)): this.cMyself.sIdent in Addr_Set{null,&""}
    //#post(void handleConnectException(Exception)): this.cMyself.sNickname == undefined
    //#post(void handleConnectException(Exception)): this.cMyself.sNickname == null
    //#post(void handleConnectException(Exception)): this.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void handleConnectException(Exception)): this.stringConverter.limit == 4
    //#post(void handleConnectException(Exception)): this.stringConverter.lowercase == &new char[](IRCStringConverter#1)
    //#post(void handleConnectException(Exception)): this.stringConverter.uppercase == &new char[](IRCStringConverter#2)
    //#post(void handleConnectException(Exception)): this.stringConverter.lowercase.length == 127
    //#post(void handleConnectException(Exception)): this.stringConverter.uppercase.length == 127
    //#post(void handleConnectException(Exception)): possibly_updated(this.stringConverter.lowercase[0..65_535])
    //#post(void handleConnectException(Exception)): possibly_updated(this.stringConverter.uppercase[0..65_567])
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.util.concurrent.Semaphore:acquireUninterruptibly
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.util.concurrent.Semaphore:release
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.util.Map:clear
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:call
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:setFake
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.util.Hashtable
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void handleConnectException(Exception)): Effects-of-calling:java.util.HashMap
		final ParserError ei = new ParserError(ParserError.ERROR_ERROR, "Exception with server socket", getLastLine());
		ei.setException(e);
		callConnectError(ei);
		
		if (currentSocketState != SocketState.CLOSED) {
			currentSocketState = SocketState.CLOSED;
			callSocketClosed();
		}
		resetState();
	}
    //#IRCParser.java:743: end of method: void com.dmdirc.parser.irc.IRCParser.handleConnectException(Exception)

	/**
	 * Begin execution.
	 * Connect to server, and start parsing incomming lines
	 */
	@Override
	public void run() {
		callDebugInfo(DEBUG_INFO, "Begin Thread Execution");
    //#IRCParser.java:751: method: void com.dmdirc.parser.irc.IRCParser.run()
    //#input(void run()): " "._tainted
    //#input(void run()): " :"._tainted
    //#input(void run()): " for mode "._tainted
    //#input(void run()): ""._tainted
    //#input(void run()): ") is invalid."._tainted
    //#input(void run()): "), Aborted"._tainted
    //#input(void run()): "*"._tainted
    //#input(void run()): ":"._tainted
    //#input(void run()): "Bind failed: "._tainted
    //#input(void run()): "Binding failed: "._tainted
    //#input(void run()): "Binding to IP: "._tainted
    //#input(void run()): "Callback not found: "._tainted
    //#input(void run()): "Connecting to "._tainted
    //#input(void run()): "Error Connecting ("._tainted
    //#input(void run()): "Exception in Processor. ["._tainted
    //#input(void run()): "Exception in main loop ("._tainted
    //#input(void run()): "Intercepted mode request for "._tainted
    //#input(void run()): "NICK "._tainted
    //#input(void run()): "No processors will handle "._tainted
    //#input(void run()): "Notice Auth"._tainted
    //#input(void run()): "OnConnectError"._tainted
    //#input(void run()): "OnDataIn"._tainted
    //#input(void run()): "OnDataOut"._tainted
    //#input(void run()): "OnDebugInfo"._tainted
    //#input(void run()): "OnErrorInfo"._tainted
    //#input(void run()): "OnNumeric"._tainted
    //#input(void run()): "OnPingSuccess"._tainted
    //#input(void run()): "OnPost005"._tainted
    //#input(void run()): "OnServerError"._tainted
    //#input(void run()): "OnSocketClosed"._tainted
    //#input(void run()): "PASS "._tainted
    //#input(void run()): "PONG :"._tainted
    //#input(void run()): "Proxy port ("._tainted
    //#input(void run()): "Server port ("._tainted
    //#input(void run()): "USER "._tainted
    //#input(void run()): "]: "._tainted
    //#input(void run()): "myself"._tainted
    //#input(void run()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void run()): __Descendant_Table[others]
    //#input(void run()): __Dispatch_Table.callConnectError(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#input(void run()): __Dispatch_Table.callDataIn(Ljava/lang/String;)Z
    //#input(void run()): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void run()): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void run()): __Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#input(void run()): __Dispatch_Table.callPingSuccess()Z
    //#input(void run()): __Dispatch_Table.callPost005()Z
    //#input(void run()): __Dispatch_Table.callServerError(Ljava/lang/String;)Z
    //#input(void run()): __Dispatch_Table.callSocketClosed()Z
    //#input(void run()): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void run()): __Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#input(void run()): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void run()): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void run()): __Dispatch_Table.getLastLine()Ljava/lang/String;
    //#input(void run()): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void run()): __Dispatch_Table.processLine(Ljava/lang/String;)V
    //#input(void run()): __Dispatch_Table.sendConnectionStrings()V
    //#input(void run()): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void run()): __Dispatch_Table.setNickname(Ljava/lang/String;)V
    //#input(void run()): __Dispatch_Table.updateCharArrays(B)V
    //#input(void run()): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void run()): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void run()): com/dmdirc/parser/irc/IRCAuthenticator.__Class_Obj.__Lock
    //#input(void run()): com/dmdirc/parser/irc/IRCAuthenticator.__Descendant_Table[com/dmdirc/parser/irc/IRCAuthenticator]
    //#input(void run()): com/dmdirc/parser/irc/IRCAuthenticator.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/parser/irc/IRCAuthenticator.__Dispatch_Table.addAuthentication(Lcom/dmdirc/parser/irc/ServerInfo;)V
    //#input(void run()): com/dmdirc/parser/irc/IRCAuthenticator.__Dispatch_Table.addAuthentication(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/IRCAuthenticator.me
    //#input(void run()): com/dmdirc/parser/irc/IRCAuthenticator.me.__Tag
    //#input(void run()): com/dmdirc/parser/irc/IRCAuthenticator.me.replies
    //#input(void run()): com/dmdirc/parser/irc/IRCProcessor.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/parser/irc/IRCProcessor.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void run()): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void run()): com/dmdirc/parser/irc/Process001.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/Process004005.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/Process464.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessAway.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessInvite.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessJoin.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessKick.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessListModes.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessMOTD.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessMessage.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessMode.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessNames.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessNick.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessNickInUse.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessNoticeAuth.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessPart.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessQuit.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessTopic.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessWallops.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessWho.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ProcessingManager.__Descendant_Table[com/dmdirc/parser/irc/ProcessingManager]
    //#input(void run()): com/dmdirc/parser/irc/ProcessingManager.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/parser/irc/ProcessingManager.__Dispatch_Table.callNumeric(I[Ljava/lang/String;)Z
    //#input(void run()): com/dmdirc/parser/irc/ProcessingManager.__Dispatch_Table.getProcessor(Ljava/lang/String;)Lcom/dmdirc/parser/irc/IRCProcessor;
    //#input(void run()): com/dmdirc/parser/irc/ProcessingManager.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void run()): com/dmdirc/parser/irc/ServerInfo.__Descendant_Table[com/dmdirc/parser/irc/ServerInfo]
    //#input(void run()): com/dmdirc/parser/irc/ServerInfo.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getHost()Ljava/lang/String;
    //#input(void run()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getPassword()Ljava/lang/String;
    //#input(void run()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getPort()I
    //#input(void run()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getProxyHost()Ljava/lang/String;
    //#input(void run()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getProxyPass()Ljava/lang/String;
    //#input(void run()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getProxyPort()I
    //#input(void run()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getProxyUser()Ljava/lang/String;
    //#input(void run()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getSSL()Z
    //#input(void run()): com/dmdirc/parser/irc/ServerInfo.__Dispatch_Table.getUseSocks()Z
    //#input(void run()): com/dmdirc/parser/irc/SocketState.CLOSED
    //#input(void run()): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void run()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void run()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void run()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void run()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void run()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void run()): java.net.Proxy$Type.SOCKS
    //#input(void run()): this
    //#input(void run()): this...__Tag
    //#input(void run()): this...lastLine
    //#input(void run()): this...myCallbackManager
    //#input(void run()): this...myCallbackManager.callbackHash
    //#input(void run()): this.__Tag
    //#input(void run()): this.bindIP
    //#input(void run()): this.bindIP._tainted
    //#input(void run()): this.cMyself.bIsFake
    //#input(void run()): this.cMyself.sNickname
    //#input(void run()): this.currentSocketState
    //#input(void run()): this.h005Info
    //#input(void run()): this.hChanModesBool
    //#input(void run()): this.hChanModesOther
    //#input(void run()): this.hChanPrefix
    //#input(void run()): this.hChannelList
    //#input(void run()): this.hClientList
    //#input(void run()): this.hPrefixMap
    //#input(void run()): this.hPrefixModes
    //#input(void run()): this.hUserModes
    //#input(void run()): this.hasBegan
    //#input(void run()): this.lastLine
    //#input(void run()): this.lastLine._tainted
    //#input(void run()): this.lastPingValue
    //#input(void run()): this.me
    //#input(void run()): this.me.nickname
    //#input(void run()): this.me.nickname._tainted
    //#input(void run()): this.me.realname
    //#input(void run()): this.me.realname._tainted
    //#input(void run()): this.me.username
    //#input(void run()): this.me.username._tainted
    //#input(void run()): this.myCallbackManager
    //#input(void run()): this.myCallbackManager.callbackHash
    //#input(void run()): this.myKeyManagers
    //#input(void run()): this.myProcessingManager
    //#input(void run()): this.myProcessingManager.__Tag
    //#input(void run()): this.myProcessingManager.myParser
    //#input(void run()): this.myProcessingManager.processHash
    //#input(void run()): this.myTrustManager
    //#input(void run()): this.pingNeeded
    //#input(void run()): this.pingTime
    //#input(void run()): this.pingTimer
    //#input(void run()): this.pingTimerSem
    //#input(void run()): this.server
    //#input(void run()): this.server.__Tag
    //#input(void run()): this.server.host
    //#input(void run()): this.server.host._tainted
    //#input(void run()): this.server.isSSL
    //#input(void run()): this.server.password
    //#input(void run()): this.server.password._tainted
    //#input(void run()): this.server.port
    //#input(void run()): this.server.proxyHost
    //#input(void run()): this.server.proxyPass
    //#input(void run()): this.server.proxyPort
    //#input(void run()): this.server.proxyUser
    //#input(void run()): this.server.useSocksProxy
    //#input(void run()): this.socket
    //#input(void run()): this.stringConverter.__Tag
    //#input(void run()): this.stringConverter.lowercase
    //#input(void run()): this.stringConverter.lowercase.length
    //#input(void run()): this.stringConverter.lowercase[0..65_535]
    //#input(void run()): this.trustAllCerts
    //#output(void run()): com/dmdirc/parser/irc/IRCAuthenticator.me
    //#output(void run()): java.lang.String:substring(...)._tainted
    //#output(void run()): new BufferedReader(connect#19) num objects
    //#output(void run()): new ClientInfo(resetState#1) num objects
    //#output(void run()): new ClientInfo(resetState#1).__Tag
    //#output(void run()): new ClientInfo(resetState#1).bIsFake
    //#output(void run()): new ClientInfo(resetState#1).lModeQueue
    //#output(void run()): new ClientInfo(resetState#1).myAwayReason
    //#output(void run()): new ClientInfo(resetState#1).myChannelClientInfos
    //#output(void run()): new ClientInfo(resetState#1).myMap
    //#output(void run()): new ClientInfo(resetState#1).myParser
    //#output(void run()): new ClientInfo(resetState#1).sHost
    //#output(void run()): new ClientInfo(resetState#1).sIdent
    //#output(void run()): new ClientInfo(resetState#1).sNickname
    //#output(void run()): new ClientInfo(resetState#1).sRealName
    //#output(void run()): new HashMap(ClientInfo#3) num objects
    //#output(void run()): new HashMap(IRCAuthenticator#1) num objects
    //#output(void run()): new Hashtable(ClientInfo#1) num objects
    //#output(void run()): new IRCAuthenticator(getIRCAuthenticator#1) num objects
    //#output(void run()): new IRCAuthenticator(getIRCAuthenticator#1).__Tag
    //#output(void run()): new IRCAuthenticator(getIRCAuthenticator#1).replies
    //#output(void run()): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void run()): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void run()): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void run()): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void run()): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void run()): new IRCStringConverter(updateCharArrays#1) num objects
    //#output(void run()): new IRCStringConverter(updateCharArrays#1).__Tag
    //#output(void run()): new IRCStringConverter(updateCharArrays#1).limit
    //#output(void run()): new IRCStringConverter(updateCharArrays#1).lowercase
    //#output(void run()): new IRCStringConverter(updateCharArrays#1).uppercase
    //#output(void run()): new LinkedList(ClientInfo#2) num objects
    //#output(void run()): new PrintWriter(connect#18) num objects
    //#output(void run()): new Socket(connect#10) num objects
    //#output(void run()): new Socket(connect#6) num objects
    //#output(void run()): new char[](IRCStringConverter#1) num objects
    //#output(void run()): new char[](IRCStringConverter#1).length
    //#output(void run()): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void run()): new char[](IRCStringConverter#2) num objects
    //#output(void run()): new char[](IRCStringConverter#2).length
    //#output(void run()): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void run()): this.cMyself
    //#output(void run()): this.cMyself.myAwayReason
    //#output(void run()): this.currentSocketState
    //#output(void run()): this.got001
    //#output(void run()): this.hasBegan
    //#output(void run()): this.in
    //#output(void run()): this.lastLine
    //#output(void run()): this.lastPingValue
    //#output(void run()): this.me.nickname
    //#output(void run()): this.myTrustManager
    //#output(void run()): this.nNextKeyCMBool
    //#output(void run()): this.nNextKeyPrefix
    //#output(void run()): this.nNextKeyUser
    //#output(void run()): this.out
    //#output(void run()): this.pingTimer
    //#output(void run()): this.post005
    //#output(void run()): this.sNetworkName
    //#output(void run()): this.sServerName
    //#output(void run()): this.sThinkNickname
    //#output(void run()): this.serverLag
    //#output(void run()): this.socket
    //#output(void run()): this.stringConverter
    //#output(void run()): this.triedAlt
    //#new obj(void run()): java.lang.String:substring(...)
    //#new obj(void run()): new BufferedReader(connect#19)
    //#new obj(void run()): new ClientInfo(resetState#1)
    //#new obj(void run()): new HashMap(ClientInfo#3)
    //#new obj(void run()): new HashMap(IRCAuthenticator#1)
    //#new obj(void run()): new Hashtable(ClientInfo#1)
    //#new obj(void run()): new IRCAuthenticator(getIRCAuthenticator#1)
    //#new obj(void run()): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void run()): new IRCStringConverter(updateCharArrays#1)
    //#new obj(void run()): new LinkedList(ClientInfo#2)
    //#new obj(void run()): new PrintWriter(connect#18)
    //#new obj(void run()): new Socket(connect#10)
    //#new obj(void run()): new Socket(connect#6)
    //#new obj(void run()): new char[](IRCStringConverter#1)
    //#new obj(void run()): new char[](IRCStringConverter#2)
    //#pre[8] (void run()): init'ed(this.hasBegan)
    //#pre[33] (void run()): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[53] (void run()): this.myCallbackManager != null
    //#pre[54] (void run()): this.myCallbackManager.callbackHash != null
    //#pre[3] (void run()): (soft) init'ed(com/dmdirc/parser/irc/IRCAuthenticator.me)
    //#pre[6] (void run()): (soft) init'ed(this.currentSocketState)
    //#pre[10] (void run()): (soft) init'ed(this.lastLine)
    //#pre[11] (void run()): (soft) this.lastPingValue != null
    //#pre[12] (void run()): (soft) init'ed(this.me.nickname)
    //#pre[13] (void run()): (soft) init'ed(this.myTrustManager)
    //#pre[18] (void run()): (soft) init'ed(this.pingTimer)
    //#pre[24] (void run()): (soft) this.socket != null
    //#pre[28] (void run()): (soft) this...__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[29] (void run()): (soft) init'ed(this...lastLine)
    //#pre[30] (void run()): (soft) this...myCallbackManager != null
    //#pre[31] (void run()): (soft) this...myCallbackManager.callbackHash != null
    //#pre[34] (void run()): (soft) init'ed(this.bindIP)
    //#pre[36] (void run()): (soft) this.h005Info != null
    //#pre[37] (void run()): (soft) this.hChanModesBool != null
    //#pre[38] (void run()): (soft) this.hChanModesOther != null
    //#pre[39] (void run()): (soft) this.hChanPrefix != null
    //#pre[40] (void run()): (soft) this.hChannelList != null
    //#pre[42] (void run()): (soft) this.hClientList != null
    //#pre[43] (void run()): (soft) this.hPrefixMap != null
    //#pre[44] (void run()): (soft) this.hPrefixModes != null
    //#pre[45] (void run()): (soft) this.hUserModes != null
    //#pre[47] (void run()): (soft) this.me != null
    //#pre[49] (void run()): (soft) init'ed(this.me.realname)
    //#pre[51] (void run()): (soft) init'ed(this.me.username)
    //#pre[55] (void run()): (soft) init'ed(this.myKeyManagers)
    //#pre[56] (void run()): (soft) this.myProcessingManager != null
    //#pre[57] (void run()): (soft) this.myProcessingManager.__Tag == com/dmdirc/parser/irc/ProcessingManager
    //#pre[58] (void run()): (soft) this.myProcessingManager.myParser != null
    //#pre[59] (void run()): (soft) this.myProcessingManager.processHash != null
    //#pre[60] (void run()): (soft) this.pingNeeded != null
    //#pre[61] (void run()): (soft) init'ed(this.pingTime)
    //#pre[62] (void run()): (soft) this.pingTimerSem != null
    //#pre[63] (void run()): (soft) this.server != null
    //#pre[64] (void run()): (soft) this.server.__Tag == com/dmdirc/parser/irc/ServerInfo
    //#pre[65] (void run()): (soft) init'ed(this.server.host)
    //#pre[67] (void run()): (soft) init'ed(this.server.isSSL)
    //#pre[68] (void run()): (soft) this.server.password != null
    //#pre[70] (void run()): (soft) this.server.port in {1..65_535}
    //#pre[71] (void run()): (soft) this.server.proxyHost != null
    //#pre[72] (void run()): (soft) init'ed(this.server.proxyPass)
    //#pre[73] (void run()): (soft) this.server.proxyPort in {1..65_535}
    //#pre[74] (void run()): (soft) init'ed(this.server.proxyUser)
    //#pre[75] (void run()): (soft) init'ed(this.server.useSocksProxy)
    //#presumption(void run()): new ClientInfo(resetState#1).sNickname@754 != null
    //#post(void run()): com/dmdirc/parser/irc/IRCAuthenticator.me == One-of{old com/dmdirc/parser/irc/IRCAuthenticator.me, &new IRCAuthenticator(getIRCAuthenticator#1)}
    //#post(void run()): init'ed(com/dmdirc/parser/irc/IRCAuthenticator.me)
    //#post(void run()): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void run()): possibly_updated(java.lang.String:substring(...)._tainted)
    //#post(void run()): this.cMyself == One-of{old this.cMyself, &new ClientInfo(resetState#1)}
    //#post(void run()): init'ed(this.cMyself.myAwayReason)
    //#post(void run()): this.currentSocketState == One-of{old this.currentSocketState, &com.dmdirc.parser.irc.SocketState__static_init.new SocketState(SocketState__static_init#2)}
    //#post(void run()): init'ed(this.currentSocketState)
    //#post(void run()): possibly_updated(this.got001)
    //#post(void run()): this.hasBegan == 1
    //#post(void run()): this.in == One-of{old this.in, &new BufferedReader(connect#19)}
    //#post(void run()): this.lastLine == One-of{old this.lastLine, &""}
    //#post(void run()): init'ed(this.lastLine)
    //#post(void run()): possibly_updated(this.lastPingValue)
    //#post(void run()): init'ed(this.me.nickname)
    //#post(void run()): this.myTrustManager == One-of{old this.myTrustManager, this.trustAllCerts}
    //#post(void run()): init'ed(this.myTrustManager)
    //#post(void run()): this.nNextKeyCMBool == One-of{old this.nNextKeyCMBool, 1}
    //#post(void run()): this.nNextKeyPrefix == One-of{old this.nNextKeyPrefix, 1}
    //#post(void run()): this.nNextKeyUser == One-of{old this.nNextKeyUser, 1}
    //#post(void run()): this.out == One-of{old this.out, &new PrintWriter(connect#18)}
    //#post(void run()): this.pingTimer == One-of{old this.pingTimer, null}
    //#post(void run()): init'ed(this.pingTimer)
    //#post(void run()): possibly_updated(this.post005)
    //#post(void run()): this.sNetworkName == One-of{old this.sNetworkName, &""}
    //#post(void run()): this.sServerName == One-of{old this.sServerName, &""}
    //#post(void run()): this.sThinkNickname == One-of{old this.sThinkNickname, old this.me.nickname}
    //#post(void run()): possibly_updated(this.serverLag)
    //#post(void run()): this.socket != null
    //#post(void run()): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(updateCharArrays#1)}
    //#post(void run()): possibly_updated(this.triedAlt)
    //#post(void run()): new BufferedReader(connect#19) num objects <= 1
    //#post(void run()): new ClientInfo(resetState#1) num objects <= 1
    //#post(void run()): init'ed(new ClientInfo(resetState#1).__Tag)
    //#post(void run()): init'ed(new ClientInfo(resetState#1).bIsFake)
    //#post(void run()): init'ed(new ClientInfo(resetState#1).lModeQueue)
    //#post(void run()): init'ed(new ClientInfo(resetState#1).myAwayReason)
    //#post(void run()): possibly_updated(new ClientInfo(resetState#1).myAwayReason)
    //#post(void run()): init'ed(new ClientInfo(resetState#1).myChannelClientInfos)
    //#post(void run()): init'ed(new ClientInfo(resetState#1).myMap)
    //#post(void run()): init'ed(new ClientInfo(resetState#1).myParser)
    //#post(void run()): possibly_updated(new ClientInfo(resetState#1).sHost)
    //#post(void run()): possibly_updated(new ClientInfo(resetState#1).sIdent)
    //#post(void run()): possibly_updated(new ClientInfo(resetState#1).sNickname)
    //#post(void run()): init'ed(new ClientInfo(resetState#1).sNickname)
    //#post(void run()): init'ed(new ClientInfo(resetState#1).sRealName)
    //#post(void run()): new HashMap(ClientInfo#3) num objects <= 1
    //#post(void run()): new HashMap(IRCAuthenticator#1) num objects <= 1
    //#post(void run()): new Hashtable(ClientInfo#1) num objects <= 1
    //#post(void run()): new IRCAuthenticator(getIRCAuthenticator#1) num objects <= 1
    //#post(void run()): init'ed(new IRCAuthenticator(getIRCAuthenticator#1).__Tag)
    //#post(void run()): init'ed(new IRCAuthenticator(getIRCAuthenticator#1).replies)
    //#post(void run()): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void run()): possibly_updated(new IRCStringConverter(getIRCStringConverter#1) num objects)
    //#post(void run()): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void run()): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void run()): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void run()): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void run()): new IRCStringConverter(updateCharArrays#1) num objects <= 1
    //#post(void run()): init'ed(new IRCStringConverter(updateCharArrays#1).__Tag)
    //#post(void run()): init'ed(new IRCStringConverter(updateCharArrays#1).limit)
    //#post(void run()): init'ed(new IRCStringConverter(updateCharArrays#1).lowercase)
    //#post(void run()): init'ed(new IRCStringConverter(updateCharArrays#1).uppercase)
    //#post(void run()): new LinkedList(ClientInfo#2) num objects <= 1
    //#post(void run()): new PrintWriter(connect#18) num objects <= 1
    //#post(void run()): new Socket(connect#10) num objects <= 1
    //#post(void run()): new Socket(connect#6) num objects <= 1
    //#post(void run()): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void run()): possibly_updated(new char[](IRCStringConverter#1) num objects)
    //#post(void run()): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void run()): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void run()): init'ed(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void run()): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void run()): possibly_updated(new char[](IRCStringConverter#2) num objects)
    //#post(void run()): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void run()): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#post(void run()): init'ed(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void run()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void run()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void run()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void run()): Effects-of-calling:java.util.concurrent.atomic.AtomicBoolean:set
    //#unanalyzed(void run()): Effects-of-calling:java.util.concurrent.Semaphore:acquireUninterruptibly
    //#unanalyzed(void run()): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void run()): Effects-of-calling:java.util.concurrent.Semaphore:release
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void run()): Effects-of-calling:isFake
    //#unanalyzed(void run()): Effects-of-calling:getNickname
    //#unanalyzed(void run()): Effects-of-calling:java.util.Map:clear
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void run()): Effects-of-calling:java.lang.System:currentTimeMillis
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void run()): Effects-of-calling:doSendString
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void run()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void run()): Effects-of-calling:getCallbackType
    //#unanalyzed(void run()): Effects-of-calling:call
    //#unanalyzed(void run()): Effects-of-calling:callSocketClosed
    //#unanalyzed(void run()): Effects-of-calling:resetState
    //#unanalyzed(void run()): Effects-of-calling:callDebugInfo
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void run()): Effects-of-calling:callErrorInfo
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void run()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Exception:getMessage
    //#unanalyzed(void run()): Effects-of-calling:callConnectError
    //#unanalyzed(void run()): Effects-of-calling:java.io.IOException:getMessage
    //#unanalyzed(void run()): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo
    //#unanalyzed(void run()): Effects-of-calling:setFake
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void run()): Effects-of-calling:callPingSuccess
    //#unanalyzed(void run()): Effects-of-calling:callServerError
    //#unanalyzed(void run()): Effects-of-calling:java.util.Hashtable:containsKey
    //#unanalyzed(void run()): Effects-of-calling:java.util.Hashtable:get
    //#unanalyzed(void run()): Effects-of-calling:java.lang.Exception
    //#unanalyzed(void run()): Effects-of-calling:getCallbackManager
    //#unanalyzed(void run()): Effects-of-calling:process
    //#unanalyzed(void run()): Effects-of-calling:getLastLine
    //#unanalyzed(void run()): Effects-of-calling:java.io.IOException
    //#unanalyzed(void run()): Effects-of-calling:java.net.InetSocketAddress
    //#unanalyzed(void run()): Effects-of-calling:java.net.Proxy
    //#unanalyzed(void run()): Effects-of-calling:java.net.Socket
    //#unanalyzed(void run()): Effects-of-calling:java.net.Authenticator
    //#unanalyzed(void run()): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void run()): Effects-of-calling:java.net.Authenticator:setDefault
    //#unanalyzed(void run()): Effects-of-calling:java.net.PasswordAuthentication
    //#unanalyzed(void run()): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void run()): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void run()): Effects-of-calling:java.net.Socket:connect
    //#unanalyzed(void run()): Effects-of-calling:java.net.InetAddress:getByName
    //#unanalyzed(void run()): Effects-of-calling:java.net.Socket:bind
    //#unanalyzed(void run()): Effects-of-calling:javax.net.ssl.SSLContext:getInstance
    //#unanalyzed(void run()): Effects-of-calling:java.security.SecureRandom
    //#unanalyzed(void run()): Effects-of-calling:javax.net.ssl.SSLContext:init
    //#unanalyzed(void run()): Effects-of-calling:javax.net.ssl.SSLContext:getSocketFactory
    //#unanalyzed(void run()): Effects-of-calling:javax.net.ssl.SSLSocketFactory:createSocket
    //#unanalyzed(void run()): Effects-of-calling:java.net.UnknownHostException:getMessage
    //#unanalyzed(void run()): Effects-of-calling:java.net.Socket:getOutputStream
    //#unanalyzed(void run()): Effects-of-calling:java.io.PrintWriter
    //#unanalyzed(void run()): Effects-of-calling:java.net.Socket:getInputStream
    //#unanalyzed(void run()): Effects-of-calling:java.io.InputStreamReader
    //#unanalyzed(void run()): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(void run()): Effects-of-calling:java.net.InetAddress:getLocalHost
    //#unanalyzed(void run()): Effects-of-calling:java.net.InetAddress:getHostAddress
    //#unanalyzed(void run()): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void run()): Effects-of-calling:setAwayReason
    //#unanalyzed(void run()): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void run()): Effects-of-calling:getListModeQueue
    //#unanalyzed(void run()): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void run()): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void run()): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void run()): Effects-of-calling:java.util.Hashtable
    //#test_vector(void run()): this.hasBegan: {0}, {1}
    //#test_vector(void run()): java.io.BufferedReader:readLine(...)@775: Inverse{null}, Addr_Set{null}
		if (hasBegan) { return; } else { hasBegan = true; }
		try {
		 connect();
		} catch (UnknownHostException e) {
			handleConnectException(e);
			return;
		} catch (IOException e) {
			handleConnectException(e);
			return;
		} catch (NoSuchAlgorithmException e) {
			handleConnectException(e);
			return;
		} catch (KeyManagementException e) {
			handleConnectException(e);
			return;
		}

		callDebugInfo(DEBUG_SOCKET, "Socket Connected");

		sendConnectionStrings();

		while (true) {
			try {
				lastLine = in.readLine(); // Blocking :/
				if (lastLine == null) {
					if (currentSocketState != SocketState.CLOSED) {
						currentSocketState = SocketState.CLOSED;
						callSocketClosed();
					}
					resetState();
					break;
				} else {
					processLine(lastLine);
    //#IRCParser.java:784: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCParser.processLine: (soft) this.lastPingValue != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void run()
    //#    basic block: bb_16
    //#    assertion: (soft) this.lastPingValue != null
    //#    callee: void com/dmdirc/parser/irc/IRCParser.processLine(String)
    //#    callee assertion: (soft) this.lastPingValue != null
    //#    callee file: IRCParser.java
    //#    callee precondition index: [4]
    //#    callee srcpos: 985
    //#    VN: this.lastPingValue
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad  Soft
    //#IRCParser.java:784: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCParser.processLine: (soft) init'ed(this.stringConverter)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void run()
    //#    basic block: bb_16
    //#    assertion: (soft) init'ed(this.stringConverter)
    //#    callee: void com/dmdirc/parser/irc/IRCParser.processLine(String)
    //#    callee assertion: (soft) init'ed(this.stringConverter)
    //#    callee file: IRCParser.java
    //#    callee precondition index: [7]
    //#    callee srcpos: 985
    //#    VN: this.stringConverter
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
				}
			} catch (IOException e) {
				callDebugInfo(DEBUG_SOCKET, "Exception in main loop (" + e.getMessage() + "), Aborted");
				
				if (currentSocketState != SocketState.CLOSED) {
					currentSocketState = SocketState.CLOSED;
					callSocketClosed();
				}
				resetState();
				break;
			}
		}
		callDebugInfo(DEBUG_INFO, "End Thread Execution");
	}
    //#IRCParser.java:798: end of method: void com.dmdirc.parser.irc.IRCParser.run()

	/**
	 * Get the current local port number.
	 *
	 * @return 0 if not connected, else the current local port number
	 */
	public int getLocalPort() {
		if (currentSocketState == SocketState.OPEN) {
    //#IRCParser.java:806: method: int com.dmdirc.parser.irc.IRCParser.getLocalPort()
    //#input(int getLocalPort()): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(int getLocalPort()): this
    //#input(int getLocalPort()): this.currentSocketState
    //#input(int getLocalPort()): this.socket
    //#output(int getLocalPort()): return_value
    //#pre[2] (int getLocalPort()): init'ed(this.currentSocketState)
    //#pre[3] (int getLocalPort()): (soft) this.socket != null
    //#post(int getLocalPort()): init'ed(return_value)
			return socket.getLocalPort();
		} else {
			return 0;
    //#IRCParser.java:809: end of method: int com.dmdirc.parser.irc.IRCParser.getLocalPort()
		}
	}

	/** Close socket on destroy. */
	@Override
	protected void finalize() throws Throwable {
		try { socket.close(); }
    //#IRCParser.java:816: method: void com.dmdirc.parser.irc.IRCParser.finalize()
    //#input(void finalize()): "Callback not found: "._tainted
    //#input(void finalize()): "OnDebugInfo"._tainted
    //#input(void finalize()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void finalize()): __Descendant_Table[others]
    //#input(void finalize()): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void finalize()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void finalize()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void finalize()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void finalize()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void finalize()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void finalize()): this
    //#input(void finalize()): this.__Tag
    //#input(void finalize()): this.myCallbackManager
    //#input(void finalize()): this.myCallbackManager.callbackHash
    //#input(void finalize()): this.socket
    //#pre[2] (void finalize()): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[3] (void finalize()): (soft) this.myCallbackManager != null
    //#pre[4] (void finalize()): (soft) this.myCallbackManager.callbackHash != null
    //#pre[5] (void finalize()): (soft) this.socket != null
    //#unanalyzed(void finalize()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void finalize()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void finalize()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void finalize()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void finalize()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void finalize()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void finalize()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void finalize()): Effects-of-calling:call
    //#unanalyzed(void finalize()): Effects-of-calling:java.lang.Integer:valueOf
		catch (IOException e) {
			callDebugInfo(DEBUG_SOCKET, "Could not close socket");
		}
		super.finalize();
	}
    //#IRCParser.java:821: end of method: void com.dmdirc.parser.irc.IRCParser.finalize()

	/**
	 * Get the trailing parameter for a line.
	 * The parameter is everything after the first occurance of " :" ot the last token in the line after a space.
	 *
	 * @param line Line to get parameter for
	 * @return Parameter of the line
	 */
	public static String getParam(final String line) {
		String[] params = null;
    //#IRCParser.java:831: method: String com.dmdirc.parser.irc.IRCParser.getParam(String)
    //#IRCParser.java:831: Warning: unused assignment
    //#    Unused assignment into params
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: String getParam(String)
    //#    Attribs:  Uncertain
    //#IRCParser.java:831: ?check always fails: method fails for all possible inputs: String getParam(String).
    //#input(String getParam(String)): line
    //#input(String getParam(String)): line._tainted
    //#output(String getParam(String)): return_value
    //#pre[1] (String getParam(String)): (soft) line != null
    //#post(String getParam(String)): return_value == undefined
    //#post(String getParam(String)): return_value == null
		params = line.split(" :", 2);
		return params[params.length - 1];
    //#IRCParser.java:833: ?use of default init
    //#    init'ed(params.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: String getParam(String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(params.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:833: ?!array index out of bounds
    //#    (params.length - 1) >= 0
    //#    severity: HIGH
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: String getParam(String)
    //#    basic block: Entry_BB_1
    //#    assertion: (params.length - 1) >= 0
    //#    VN: undefined - 1
    //#    Expected: {0..+Inf}
    //#    Bad: {-1}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
    //#IRCParser.java:833: ?use of default init
    //#    init'ed(params[(params.length - 1)])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: String getParam(String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(params[(params.length - 1)])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:833: end of method: String com.dmdirc.parser.irc.IRCParser.getParam(String)
	}

	/**
	 * Tokenise a line.
	 * splits by " " up to the first " :" everything after this is a single token
	 *
	 * @param line Line to tokenise
	 * @return Array of tokens
	 */
	public static String[] tokeniseLine(final String line) {
		if (line == null) {
    //#IRCParser.java:844: method: String[] com.dmdirc.parser.irc.IRCParser.tokeniseLine(String)
    //#input(String[] tokeniseLine(String)): line
    //#input(String[] tokeniseLine(String)): line._tainted
    //#output(String[] tokeniseLine(String)): java.lang.String:split(...)._tainted
    //#output(String[] tokeniseLine(String)): java.lang.String:split(...)[0..+Inf]
    //#output(String[] tokeniseLine(String)): java.lang.String:substring(...)._tainted
    //#output(String[] tokeniseLine(String)): new String[](tokeniseLine#1) num objects
    //#output(String[] tokeniseLine(String)): new String[](tokeniseLine#1).length
    //#output(String[] tokeniseLine(String)): new String[](tokeniseLine#1)[0]
    //#output(String[] tokeniseLine(String)): new String[](tokeniseLine#2) num objects
    //#output(String[] tokeniseLine(String)): new String[](tokeniseLine#2).length
    //#output(String[] tokeniseLine(String)): new String[](tokeniseLine#2)[0..+Inf]
    //#output(String[] tokeniseLine(String)): return_value
    //#new obj(String[] tokeniseLine(String)): java.lang.String:split(...)
    //#new obj(String[] tokeniseLine(String)): java.lang.String:substring(...)
    //#new obj(String[] tokeniseLine(String)): new String[](tokeniseLine#1)
    //#new obj(String[] tokeniseLine(String)): new String[](tokeniseLine#2)
    //#presumption(String[] tokeniseLine(String)): java.lang.String:indexOf(...)@848 <= 4_294_967_293
    //#post(String[] tokeniseLine(String)): init'ed(java.lang.String:split(...)._tainted)
    //#post(String[] tokeniseLine(String)): java.lang.String:split(...)[0..+Inf] == null
    //#post(String[] tokeniseLine(String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(String[] tokeniseLine(String)): return_value in Addr_Set{&java.lang.String:split(...),&new String[](tokeniseLine#2),&new String[](tokeniseLine#1)}
    //#post(String[] tokeniseLine(String)): new String[](tokeniseLine#1) num objects <= 1
    //#post(String[] tokeniseLine(String)): new String[](tokeniseLine#1).length == 1
    //#post(String[] tokeniseLine(String)): new String[](tokeniseLine#1)[0] == &""
    //#post(String[] tokeniseLine(String)): new String[](tokeniseLine#2) num objects <= 1
    //#post(String[] tokeniseLine(String)): new String[](tokeniseLine#2).length == 1
    //#post(String[] tokeniseLine(String)): new String[](tokeniseLine#2)[0..+Inf] == null
    //#test_vector(String[] tokeniseLine(String)): line: Inverse{null}, Addr_Set{null}
    //#test_vector(String[] tokeniseLine(String)): java.lang.String:indexOf(...)@848: {-2_147_483_648..-1}, {0..4_294_967_293}
			return new String[]{"", }; // Return empty string[]
		}

		final int lastarg = line.indexOf(" :");
		String[] tokens;

		if (lastarg > -1) {
			final String[] temp = line.substring(0, lastarg).split(" ");
			tokens = new String[temp.length + 1];
    //#IRCParser.java:853: ?use of default init
    //#    init'ed(temp.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: String[] tokeniseLine(String)
    //#    basic block: bb_4
    //#    assertion: init'ed(temp.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
			System.arraycopy(temp, 0, tokens, 0, temp.length);
    //#IRCParser.java:854: ?use of default init
    //#    init'ed(temp.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: String[] tokeniseLine(String)
    //#    basic block: bb_4
    //#    assertion: init'ed(temp.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
			tokens[temp.length] = line.substring(lastarg + 2);
    //#IRCParser.java:855: ?use of default init
    //#    init'ed(temp.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: String[] tokeniseLine(String)
    //#    basic block: bb_4
    //#    assertion: init'ed(temp.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
		} else {
			tokens = line.split(" ");
		}

		return tokens;
    //#IRCParser.java:860: end of method: String[] com.dmdirc.parser.irc.IRCParser.tokeniseLine(String)
	}

	/**
	 * Get the ClientInfo object for a person.
	 *
	 * @param sHost Who can be any valid identifier for a client as long as it contains a nickname (?:)nick(?!ident)(?@host)
	 * @return ClientInfo Object for the client, or null
	 */
	public ClientInfo getClientInfo(final String sHost) {
		final String sWho = getIRCStringConverter().toLowerCase(ClientInfo.parseHost(sHost));
    //#IRCParser.java:870: method: ClientInfo com.dmdirc.parser.irc.IRCParser.getClientInfo(String)
    //#IRCParser.java:870: ?use of default init
    //#    init'ed(Obj_Id#3368:parseHost(...))
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: ClientInfo getClientInfo(String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(Obj_Id#3368:parseHost(...))
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:870: ?use of default init
    //#    init'ed(parseHost(...))
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: ClientInfo getClientInfo(String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(parseHost(...))
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:870: ?!precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: input != null
    //#    severity: HIGH
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: ClientInfo getClientInfo(String)
    //#    basic block: Entry_BB_1
    //#    assertion: undefined != null
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: input != null
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [1]
    //#    callee srcpos: 86
    //#    VN: undefined
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null, Invalid}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:870: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: (soft) init'ed(this.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: ClientInfo getClientInfo(String)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(getIRCStringConverter(...).lowercase[0..65_535])
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: (soft) init'ed(this.lowercase[0..65_535])
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 86
    //#    VN: getIRCStringConverter(...).lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
    //#input(ClientInfo getClientInfo(String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(ClientInfo getClientInfo(String)): __Descendant_Table[others]
    //#input(ClientInfo getClientInfo(String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/ClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ClientInfo]
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/ClientInfo.__Descendant_Table[others]
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(ClientInfo getClientInfo(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(ClientInfo getClientInfo(String)): sHost
    //#input(ClientInfo getClientInfo(String)): sHost._tainted
    //#input(ClientInfo getClientInfo(String)): this
    //#input(ClientInfo getClientInfo(String)): this.__Tag
    //#input(ClientInfo getClientInfo(String)): this.hClientList
    //#input(ClientInfo getClientInfo(String)): this.stringConverter
    //#input(ClientInfo getClientInfo(String)): this.stringConverter.__Tag
    //#input(ClientInfo getClientInfo(String)): this.stringConverter.lowercase
    //#input(ClientInfo getClientInfo(String)): this.stringConverter.lowercase.length
    //#input(ClientInfo getClientInfo(String)): this.stringConverter.lowercase[0..65_535]
    //#output(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#1) num objects
    //#output(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#1).length
    //#output(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#2) num objects
    //#output(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#2).length
    //#output(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(ClientInfo getClientInfo(String)): return_value
    //#output(ClientInfo getClientInfo(String)): this.stringConverter
    //#new obj(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#1)
    //#new obj(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#2)
    //#pre[1] (ClientInfo getClientInfo(String)): init'ed(this.stringConverter)
    //#pre[2] (ClientInfo getClientInfo(String)): sHost != null
    //#pre[5] (ClientInfo getClientInfo(String)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[6] (ClientInfo getClientInfo(String)): this.hClientList != null
    //#pre[7] (ClientInfo getClientInfo(String)): (soft) this.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[8] (ClientInfo getClientInfo(String)): (soft) this.stringConverter.lowercase != null
    //#pre[10] (ClientInfo getClientInfo(String)): (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#presumption(ClientInfo getClientInfo(String)): java.util.Map:get(...).__Tag@871 == com/dmdirc/parser/irc/ClientInfo
    //#presumption(ClientInfo getClientInfo(String)): parseHost(...)@870 init'ed
    //#post(ClientInfo getClientInfo(String)): init'ed(return_value)
    //#post(ClientInfo getClientInfo(String)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(ClientInfo getClientInfo(String)): this.stringConverter != null
    //#post(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(ClientInfo getClientInfo(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#1).length == 127
    //#post(ClientInfo getClientInfo(String)): new char[](IRCStringConverter#2).length == 127
    //#post(ClientInfo getClientInfo(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(ClientInfo getClientInfo(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(ClientInfo getClientInfo(String)): Effects-of-calling:java.lang.String:split
    //#test_vector(ClientInfo getClientInfo(String)): java.util.Map:containsKey(...)@871: {0}, {1}
		if (hClientList.containsKey(sWho)) { return hClientList.get(sWho); }
		else { return null; }
    //#IRCParser.java:872: end of method: ClientInfo com.dmdirc.parser.irc.IRCParser.getClientInfo(String)
	}

	/**
	 * Get the ClientInfo object for a person, or create a fake client info object.
	 *
	 * @param sHost Who can be any valid identifier for a client as long as it contains a nickname (?:)nick(?!ident)(?@host)
	 * @return ClientInfo Object for the client.
	 */
	public ClientInfo getClientInfoOrFake(final String sHost) {
		final String sWho = getIRCStringConverter().toLowerCase(ClientInfo.parseHost(sHost));
    //#IRCParser.java:882: method: ClientInfo com.dmdirc.parser.irc.IRCParser.getClientInfoOrFake(String)
    //#IRCParser.java:882: ?use of default init
    //#    init'ed(Obj_Id#5538:parseHost(...))
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: ClientInfo getClientInfoOrFake(String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(Obj_Id#5538:parseHost(...))
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:882: ?use of default init
    //#    init'ed(parseHost(...))
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: ClientInfo getClientInfoOrFake(String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(parseHost(...))
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:882: ?!precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: input != null
    //#    severity: HIGH
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: ClientInfo getClientInfoOrFake(String)
    //#    basic block: Entry_BB_1
    //#    assertion: undefined != null
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: input != null
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [1]
    //#    callee srcpos: 86
    //#    VN: undefined
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null, Invalid}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:882: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: (soft) init'ed(this.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: ClientInfo getClientInfoOrFake(String)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(getIRCStringConverter(...).lowercase[0..65_535])
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: (soft) init'ed(this.lowercase[0..65_535])
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 86
    //#    VN: getIRCStringConverter(...).lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
    //#input(ClientInfo getClientInfoOrFake(String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(ClientInfo getClientInfoOrFake(String)): __Descendant_Table[others]
    //#input(ClientInfo getClientInfoOrFake(String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(ClientInfo getClientInfoOrFake(String)): com/dmdirc/parser/irc/ClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ClientInfo]
    //#input(ClientInfo getClientInfoOrFake(String)): com/dmdirc/parser/irc/ClientInfo.__Descendant_Table[others]
    //#input(ClientInfo getClientInfoOrFake(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(ClientInfo getClientInfoOrFake(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(ClientInfo getClientInfoOrFake(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(ClientInfo getClientInfoOrFake(String)): sHost
    //#input(ClientInfo getClientInfoOrFake(String)): sHost._tainted
    //#input(ClientInfo getClientInfoOrFake(String)): this
    //#input(ClientInfo getClientInfoOrFake(String)): this.__Tag
    //#input(ClientInfo getClientInfoOrFake(String)): this.hClientList
    //#input(ClientInfo getClientInfoOrFake(String)): this.stringConverter
    //#input(ClientInfo getClientInfoOrFake(String)): this.stringConverter.__Tag
    //#input(ClientInfo getClientInfoOrFake(String)): this.stringConverter.lowercase
    //#input(ClientInfo getClientInfoOrFake(String)): this.stringConverter.lowercase.length
    //#input(ClientInfo getClientInfoOrFake(String)): this.stringConverter.lowercase[0..65_535]
    //#output(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1) num objects
    //#output(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).__Tag
    //#output(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).bIsFake
    //#output(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).lModeQueue
    //#output(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).myAwayReason
    //#output(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).myChannelClientInfos
    //#output(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).myMap
    //#output(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).myParser
    //#output(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).sHost
    //#output(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).sIdent
    //#output(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).sNickname
    //#output(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).sRealName
    //#output(ClientInfo getClientInfoOrFake(String)): new HashMap(ClientInfo#3) num objects
    //#output(ClientInfo getClientInfoOrFake(String)): new Hashtable(ClientInfo#1) num objects
    //#output(ClientInfo getClientInfoOrFake(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(ClientInfo getClientInfoOrFake(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(ClientInfo getClientInfoOrFake(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(ClientInfo getClientInfoOrFake(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(ClientInfo getClientInfoOrFake(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(ClientInfo getClientInfoOrFake(String)): new LinkedList(ClientInfo#2) num objects
    //#output(ClientInfo getClientInfoOrFake(String)): new char[](IRCStringConverter#1) num objects
    //#output(ClientInfo getClientInfoOrFake(String)): new char[](IRCStringConverter#1).length
    //#output(ClientInfo getClientInfoOrFake(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(ClientInfo getClientInfoOrFake(String)): new char[](IRCStringConverter#2) num objects
    //#output(ClientInfo getClientInfoOrFake(String)): new char[](IRCStringConverter#2).length
    //#output(ClientInfo getClientInfoOrFake(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(ClientInfo getClientInfoOrFake(String)): return_value
    //#output(ClientInfo getClientInfoOrFake(String)): this.stringConverter
    //#new obj(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1)
    //#new obj(ClientInfo getClientInfoOrFake(String)): new HashMap(ClientInfo#3)
    //#new obj(ClientInfo getClientInfoOrFake(String)): new Hashtable(ClientInfo#1)
    //#new obj(ClientInfo getClientInfoOrFake(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(ClientInfo getClientInfoOrFake(String)): new LinkedList(ClientInfo#2)
    //#new obj(ClientInfo getClientInfoOrFake(String)): new char[](IRCStringConverter#1)
    //#new obj(ClientInfo getClientInfoOrFake(String)): new char[](IRCStringConverter#2)
    //#pre[1] (ClientInfo getClientInfoOrFake(String)): init'ed(this.stringConverter)
    //#pre[2] (ClientInfo getClientInfoOrFake(String)): sHost != null
    //#pre[5] (ClientInfo getClientInfoOrFake(String)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[6] (ClientInfo getClientInfoOrFake(String)): this.hClientList != null
    //#pre[7] (ClientInfo getClientInfoOrFake(String)): (soft) this.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[8] (ClientInfo getClientInfoOrFake(String)): (soft) this.stringConverter.lowercase != null
    //#pre[10] (ClientInfo getClientInfoOrFake(String)): (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#presumption(ClientInfo getClientInfoOrFake(String)): java.util.Map:get(...).__Tag@883 == com/dmdirc/parser/irc/ClientInfo
    //#presumption(ClientInfo getClientInfoOrFake(String)): parseHost(...)@882 init'ed
    //#post(ClientInfo getClientInfoOrFake(String)): init'ed(return_value)
    //#post(ClientInfo getClientInfoOrFake(String)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(ClientInfo getClientInfoOrFake(String)): this.stringConverter != null
    //#post(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1) num objects <= 1
    //#post(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).__Tag == com/dmdirc/parser/irc/ClientInfo
    //#post(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).bIsFake == 1
    //#post(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).lModeQueue == &new LinkedList(ClientInfo#2)
    //#post(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).myAwayReason == &""
    //#post(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).myChannelClientInfos == &new Hashtable(ClientInfo#1)
    //#post(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).myMap == &new HashMap(ClientInfo#3)
    //#post(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).myParser == this
    //#post(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).myParser != null
    //#post(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).sHost in Addr_Set{null,&""}
    //#post(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).sIdent in Addr_Set{null,&""}
    //#post(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).sNickname == null
    //#post(ClientInfo getClientInfoOrFake(String)): new ClientInfo(getClientInfoOrFake#1).sRealName == &""
    //#post(ClientInfo getClientInfoOrFake(String)): new HashMap(ClientInfo#3) num objects <= 1
    //#post(ClientInfo getClientInfoOrFake(String)): new Hashtable(ClientInfo#1) num objects <= 1
    //#post(ClientInfo getClientInfoOrFake(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(ClientInfo getClientInfoOrFake(String)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(ClientInfo getClientInfoOrFake(String)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(ClientInfo getClientInfoOrFake(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(ClientInfo getClientInfoOrFake(String)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(ClientInfo getClientInfoOrFake(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(ClientInfo getClientInfoOrFake(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(ClientInfo getClientInfoOrFake(String)): new LinkedList(ClientInfo#2) num objects <= 1
    //#post(ClientInfo getClientInfoOrFake(String)): new char[](IRCStringConverter#1).length == 127
    //#post(ClientInfo getClientInfoOrFake(String)): new char[](IRCStringConverter#2).length == 127
    //#post(ClientInfo getClientInfoOrFake(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(ClientInfo getClientInfoOrFake(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(ClientInfo getClientInfoOrFake(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(ClientInfo getClientInfoOrFake(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(ClientInfo getClientInfoOrFake(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(ClientInfo getClientInfoOrFake(String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(ClientInfo getClientInfoOrFake(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(ClientInfo getClientInfoOrFake(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(ClientInfo getClientInfoOrFake(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(ClientInfo getClientInfoOrFake(String)): Effects-of-calling:java.util.Hashtable
    //#unanalyzed(ClientInfo getClientInfoOrFake(String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(ClientInfo getClientInfoOrFake(String)): Effects-of-calling:java.util.HashMap
    //#test_vector(ClientInfo getClientInfoOrFake(String)): java.util.Map:containsKey(...)@883: {0}, {1}
		if (hClientList.containsKey(sWho)) { return hClientList.get(sWho); }
		else { return new ClientInfo(this, sHost).setFake(true); }
    //#IRCParser.java:884: end of method: ClientInfo com.dmdirc.parser.irc.IRCParser.getClientInfoOrFake(String)
	}

	/**
	 * Get the ChannelInfo object for a channel.
	 *
	 * @param sWhat This is the name of the channel.
	 * @return ChannelInfo Object for the channel, or null
	 */
	public ChannelInfo getChannelInfo(String sWhat) {
		synchronized (hChannelList) {
    //#IRCParser.java:894: method: ChannelInfo com.dmdirc.parser.irc.IRCParser.getChannelInfo(String)
    //#input(ChannelInfo getChannelInfo(String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(ChannelInfo getChannelInfo(String)): __Descendant_Table[others]
    //#input(ChannelInfo getChannelInfo(String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(ChannelInfo getChannelInfo(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(ChannelInfo getChannelInfo(String)): sWhat
    //#input(ChannelInfo getChannelInfo(String)): this
    //#input(ChannelInfo getChannelInfo(String)): this.__Tag
    //#input(ChannelInfo getChannelInfo(String)): this.hChannelList
    //#input(ChannelInfo getChannelInfo(String)): this.hChannelList.__Lock
    //#input(ChannelInfo getChannelInfo(String)): this.stringConverter
    //#input(ChannelInfo getChannelInfo(String)): this.stringConverter.__Tag
    //#input(ChannelInfo getChannelInfo(String)): this.stringConverter.lowercase
    //#input(ChannelInfo getChannelInfo(String)): this.stringConverter.lowercase.length
    //#input(ChannelInfo getChannelInfo(String)): this.stringConverter.lowercase[0..65_535]
    //#output(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#1) num objects
    //#output(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#1).length
    //#output(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#2) num objects
    //#output(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#2).length
    //#output(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(ChannelInfo getChannelInfo(String)): return_value
    //#output(ChannelInfo getChannelInfo(String)): this.stringConverter
    //#new obj(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#1)
    //#new obj(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#2)
    //#pre[1] (ChannelInfo getChannelInfo(String)): init'ed(this.stringConverter)
    //#pre[2] (ChannelInfo getChannelInfo(String)): sWhat != null
    //#pre[4] (ChannelInfo getChannelInfo(String)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[5] (ChannelInfo getChannelInfo(String)): this.hChannelList != null
    //#pre[6] (ChannelInfo getChannelInfo(String)): (soft) this.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[7] (ChannelInfo getChannelInfo(String)): (soft) this.stringConverter.lowercase != null
    //#pre[9] (ChannelInfo getChannelInfo(String)): (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#presumption(ChannelInfo getChannelInfo(String)): java.util.Map:get(...).__Tag@896 == com/dmdirc/parser/irc/ChannelInfo
    //#post(ChannelInfo getChannelInfo(String)): init'ed(return_value)
    //#post(ChannelInfo getChannelInfo(String)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(ChannelInfo getChannelInfo(String)): this.stringConverter != null
    //#post(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(ChannelInfo getChannelInfo(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#1).length == 127
    //#post(ChannelInfo getChannelInfo(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(ChannelInfo getChannelInfo(String)): new char[](IRCStringConverter#2).length == 127
    //#post(ChannelInfo getChannelInfo(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(ChannelInfo getChannelInfo(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(ChannelInfo getChannelInfo(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(ChannelInfo getChannelInfo(String)): Effects-of-calling:java.lang.String
    //#test_vector(ChannelInfo getChannelInfo(String)): java.util.Map:containsKey(...)@896: {0}, {1}
			sWhat = getIRCStringConverter().toLowerCase(sWhat);
    //#IRCParser.java:895: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: (soft) init'ed(this.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: ChannelInfo getChannelInfo(String)
    //#    basic block: bb_2
    //#    assertion: (soft) init'ed(getIRCStringConverter(...).lowercase[0..65_535])
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: (soft) init'ed(this.lowercase[0..65_535])
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 86
    //#    VN: getIRCStringConverter(...).lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
			if (hChannelList.containsKey(sWhat)) { return hChannelList.get(sWhat); } else { return null; }
		}
    //#IRCParser.java:897: end of method: ChannelInfo com.dmdirc.parser.irc.IRCParser.getChannelInfo(String)
	}

	/**
	 * Send a line to the server.
	 *
	 * @param line Line to send (\r\n termination is added automatically)
	 */
	public void sendLine(final String line) { doSendString(line, false); }
    //#IRCParser.java:905: method: void com.dmdirc.parser.irc.IRCParser.sendLine(String)
    //#input(void sendLine(String)): " for mode "._tainted
    //#input(void sendLine(String)): "Callback not found: "._tainted
    //#input(void sendLine(String)): "Intercepted mode request for "._tainted
    //#input(void sendLine(String)): "OnDataOut"._tainted
    //#input(void sendLine(String)): "OnDebugInfo"._tainted
    //#input(void sendLine(String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendLine(String)): __Descendant_Table[others]
    //#input(void sendLine(String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendLine(String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendLine(String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendLine(String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendLine(String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendLine(String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendLine(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendLine(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void sendLine(String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendLine(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendLine(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendLine(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendLine(String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendLine(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendLine(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendLine(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendLine(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendLine(String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendLine(String)): line
    //#input(void sendLine(String)): line._tainted
    //#input(void sendLine(String)): this
    //#input(void sendLine(String)): this.__Tag
    //#input(void sendLine(String)): this.cMyself
    //#input(void sendLine(String)): this.currentSocketState
    //#input(void sendLine(String)): this.hChanModesOther
    //#input(void sendLine(String)): this.hChannelList
    //#input(void sendLine(String)): this.myCallbackManager
    //#input(void sendLine(String)): this.myCallbackManager.callbackHash
    //#input(void sendLine(String)): this.out
    //#input(void sendLine(String)): this.stringConverter
    //#input(void sendLine(String)): this.stringConverter.__Tag
    //#input(void sendLine(String)): this.stringConverter.lowercase
    //#input(void sendLine(String)): this.stringConverter.lowercase.length
    //#output(void sendLine(String)): java.lang.String:substring(...)._tainted
    //#output(void sendLine(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendLine(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendLine(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendLine(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendLine(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendLine(String)): new char[](IRCStringConverter#1) num objects
    //#output(void sendLine(String)): new char[](IRCStringConverter#1).length
    //#output(void sendLine(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendLine(String)): new char[](IRCStringConverter#2) num objects
    //#output(void sendLine(String)): new char[](IRCStringConverter#2).length
    //#output(void sendLine(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendLine(String)): this.cMyself.myAwayReason
    //#output(void sendLine(String)): this.stringConverter
    //#new obj(void sendLine(String)): java.lang.String:substring(...)
    //#new obj(void sendLine(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendLine(String)): new char[](IRCStringConverter#1)
    //#new obj(void sendLine(String)): new char[](IRCStringConverter#2)
    //#pre[6] (void sendLine(String)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[14] (void sendLine(String)): init'ed(this.out)
    //#pre[4] (void sendLine(String)): (soft) init'ed(this.stringConverter)
    //#pre[7] (void sendLine(String)): (soft) this.cMyself != null
    //#pre[8] (void sendLine(String)): (soft) init'ed(this.currentSocketState)
    //#pre[9] (void sendLine(String)): (soft) this.hChanModesOther != null
    //#pre[10] (void sendLine(String)): (soft) this.hChannelList != null
    //#pre[12] (void sendLine(String)): (soft) this.myCallbackManager != null
    //#pre[13] (void sendLine(String)): (soft) this.myCallbackManager.callbackHash != null
    //#post(void sendLine(String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendLine(String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void sendLine(String)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendLine(String)): init'ed(this.stringConverter)
    //#post(void sendLine(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendLine(String)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void sendLine(String)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void sendLine(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendLine(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendLine(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendLine(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendLine(String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendLine(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendLine(String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendLine(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendLine(String)): Effects-of-calling:call
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendLine(String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendLine(String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#IRCParser.java:905: end of method: void com.dmdirc.parser.irc.IRCParser.sendLine(String)

	/**
	 * Send a line to the server and add proper line ending.
	 *
	 * @param line Line to send (\r\n termination is added automatically)
	 */
	protected void sendString(final String line) { doSendString(line, true); }
    //#IRCParser.java:912: method: void com.dmdirc.parser.irc.IRCParser.sendString(String)
    //#input(void sendString(String)): " for mode "._tainted
    //#input(void sendString(String)): "Callback not found: "._tainted
    //#input(void sendString(String)): "Intercepted mode request for "._tainted
    //#input(void sendString(String)): "OnDataOut"._tainted
    //#input(void sendString(String)): "OnDebugInfo"._tainted
    //#input(void sendString(String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendString(String)): __Descendant_Table[others]
    //#input(void sendString(String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendString(String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendString(String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendString(String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendString(String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendString(String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendString(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendString(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void sendString(String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendString(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendString(String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendString(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendString(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendString(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendString(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendString(String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendString(String)): line
    //#input(void sendString(String)): line._tainted
    //#input(void sendString(String)): this
    //#input(void sendString(String)): this.__Tag
    //#input(void sendString(String)): this.cMyself
    //#input(void sendString(String)): this.currentSocketState
    //#input(void sendString(String)): this.hChanModesOther
    //#input(void sendString(String)): this.hChannelList
    //#input(void sendString(String)): this.myCallbackManager
    //#input(void sendString(String)): this.myCallbackManager.callbackHash
    //#input(void sendString(String)): this.out
    //#input(void sendString(String)): this.stringConverter
    //#input(void sendString(String)): this.stringConverter.__Tag
    //#input(void sendString(String)): this.stringConverter.lowercase
    //#input(void sendString(String)): this.stringConverter.lowercase.length
    //#output(void sendString(String)): java.lang.String:substring(...)._tainted
    //#output(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendString(String)): new char[](IRCStringConverter#1) num objects
    //#output(void sendString(String)): new char[](IRCStringConverter#1).length
    //#output(void sendString(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendString(String)): new char[](IRCStringConverter#2) num objects
    //#output(void sendString(String)): new char[](IRCStringConverter#2).length
    //#output(void sendString(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendString(String)): this.cMyself.myAwayReason
    //#output(void sendString(String)): this.stringConverter
    //#new obj(void sendString(String)): java.lang.String:substring(...)
    //#new obj(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendString(String)): new char[](IRCStringConverter#1)
    //#new obj(void sendString(String)): new char[](IRCStringConverter#2)
    //#pre[6] (void sendString(String)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[14] (void sendString(String)): init'ed(this.out)
    //#pre[4] (void sendString(String)): (soft) init'ed(this.stringConverter)
    //#pre[7] (void sendString(String)): (soft) this.cMyself != null
    //#pre[8] (void sendString(String)): (soft) init'ed(this.currentSocketState)
    //#pre[9] (void sendString(String)): (soft) this.hChanModesOther != null
    //#pre[10] (void sendString(String)): (soft) this.hChannelList != null
    //#pre[12] (void sendString(String)): (soft) this.myCallbackManager != null
    //#pre[13] (void sendString(String)): (soft) this.myCallbackManager.callbackHash != null
    //#post(void sendString(String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendString(String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void sendString(String)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendString(String)): init'ed(this.stringConverter)
    //#post(void sendString(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendString(String)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void sendString(String)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void sendString(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendString(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendString(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendString(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendString(String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendString(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendString(String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendString(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendString(String)): Effects-of-calling:call
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendString(String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendString(String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void sendString(String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#IRCParser.java:912: end of method: void com.dmdirc.parser.irc.IRCParser.sendString(String)

	/**
	 * Send a line to the server and add proper line ending.
	 *
	 * @param line Line to send (\r\n termination is added automatically)
	 * @param fromParser is this line from the parser? (used for callDataOut)
	 */
	protected void doSendString(final String line, final boolean fromParser) {
		if (out == null || getSocketState() != SocketState.OPEN) { return; }
    //#IRCParser.java:921: method: void com.dmdirc.parser.irc.IRCParser.doSendString(String, bool)
    //#input(void doSendString(String, bool)): " for mode "._tainted
    //#input(void doSendString(String, bool)): "Callback not found: "._tainted
    //#input(void doSendString(String, bool)): "Intercepted mode request for "._tainted
    //#input(void doSendString(String, bool)): "OnDataOut"._tainted
    //#input(void doSendString(String, bool)): "OnDebugInfo"._tainted
    //#input(void doSendString(String, bool)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void doSendString(String, bool)): __Descendant_Table[others]
    //#input(void doSendString(String, bool)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void doSendString(String, bool)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void doSendString(String, bool)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void doSendString(String, bool)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void doSendString(String, bool)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void doSendString(String, bool)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void doSendString(String, bool)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void doSendString(String, bool)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void doSendString(String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void doSendString(String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void doSendString(String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void doSendString(String, bool)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void doSendString(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void doSendString(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void doSendString(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void doSendString(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void doSendString(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void doSendString(String, bool)): fromParser
    //#input(void doSendString(String, bool)): line
    //#input(void doSendString(String, bool)): line._tainted
    //#input(void doSendString(String, bool)): this
    //#input(void doSendString(String, bool)): this.__Tag
    //#input(void doSendString(String, bool)): this.cMyself
    //#input(void doSendString(String, bool)): this.currentSocketState
    //#input(void doSendString(String, bool)): this.hChanModesOther
    //#input(void doSendString(String, bool)): this.hChannelList
    //#input(void doSendString(String, bool)): this.myCallbackManager
    //#input(void doSendString(String, bool)): this.myCallbackManager.callbackHash
    //#input(void doSendString(String, bool)): this.out
    //#input(void doSendString(String, bool)): this.stringConverter
    //#input(void doSendString(String, bool)): this.stringConverter.__Tag
    //#input(void doSendString(String, bool)): this.stringConverter.lowercase
    //#input(void doSendString(String, bool)): this.stringConverter.lowercase.length
    //#input(void doSendString(String, bool)): this.stringConverter.lowercase[0..65_535]
    //#output(void doSendString(String, bool)): java.lang.String:substring(...)._tainted
    //#output(void doSendString(String, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void doSendString(String, bool)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void doSendString(String, bool)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void doSendString(String, bool)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void doSendString(String, bool)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void doSendString(String, bool)): new char[](IRCStringConverter#1) num objects
    //#output(void doSendString(String, bool)): new char[](IRCStringConverter#1).length
    //#output(void doSendString(String, bool)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void doSendString(String, bool)): new char[](IRCStringConverter#2) num objects
    //#output(void doSendString(String, bool)): new char[](IRCStringConverter#2).length
    //#output(void doSendString(String, bool)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void doSendString(String, bool)): this.cMyself.myAwayReason
    //#output(void doSendString(String, bool)): this.stringConverter
    //#new obj(void doSendString(String, bool)): java.lang.String:substring(...)
    //#new obj(void doSendString(String, bool)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void doSendString(String, bool)): new char[](IRCStringConverter#1)
    //#new obj(void doSendString(String, bool)): new char[](IRCStringConverter#2)
    //#pre[15] (void doSendString(String, bool)): init'ed(this.out)
    //#pre[5] (void doSendString(String, bool)): (soft) init'ed(this.stringConverter)
    //#pre[7] (void doSendString(String, bool)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[8] (void doSendString(String, bool)): (soft) this.cMyself != null
    //#pre[9] (void doSendString(String, bool)): (soft) init'ed(this.currentSocketState)
    //#pre[10] (void doSendString(String, bool)): (soft) this.hChanModesOther != null
    //#pre[11] (void doSendString(String, bool)): (soft) this.hChannelList != null
    //#pre[13] (void doSendString(String, bool)): (soft) this.myCallbackManager != null
    //#pre[14] (void doSendString(String, bool)): (soft) this.myCallbackManager.callbackHash != null
    //#presumption(void doSendString(String, bool)): channel.myParser.__Tag@932 == com/dmdirc/parser/irc/IRCParser
    //#presumption(void doSendString(String, bool)): channel.myParser.myCallbackManager.callbackHash@932 != null
    //#presumption(void doSendString(String, bool)): channel.myParser.myCallbackManager@932 != null
    //#presumption(void doSendString(String, bool)): channel.myParser@932 != null
    //#presumption(void doSendString(String, bool)): java.util.Map:get(...)@938 != null
    //#presumption(void doSendString(String, bool)): newLine.length in {1..4_294_967_296}
    //#presumption(void doSendString(String, bool)): newLine[0] != null
    //#presumption(void doSendString(String, bool)): newLine[1] != null
    //#presumption(void doSendString(String, bool)): newLine[2] != null
    //#presumption(void doSendString(String, bool)): this.stringConverter.__Tag@922 == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void doSendString(String, bool)): this.stringConverter.lowercase@922 != null
    //#post(void doSendString(String, bool)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void doSendString(String, bool)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void doSendString(String, bool)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void doSendString(String, bool)): init'ed(this.stringConverter)
    //#post(void doSendString(String, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void doSendString(String, bool)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void doSendString(String, bool)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void doSendString(String, bool)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void doSendString(String, bool)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void doSendString(String, bool)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void doSendString(String, bool)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void doSendString(String, bool)): init'ed(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void doSendString(String, bool)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void doSendString(String, bool)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void doSendString(String, bool)): init'ed(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.String
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:call
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void doSendString(String, bool)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#test_vector(void doSendString(String, bool)): this.out: Addr_Set{null}, Inverse{null}
    //#test_vector(void doSendString(String, bool)): java.lang.Byte:byteValue(...)@938: {-128..0, 2..255}, {1}
    //#test_vector(void doSendString(String, bool)): java.lang.String:equalsIgnoreCase(...)@925: {0}, {1}
    //#test_vector(void doSendString(String, bool)): java.lang.String:equalsIgnoreCase(...)@927: {0}, {1}
    //#test_vector(void doSendString(String, bool)): java.util.LinkedList:contains(...)@939: {0}, {1}
    //#test_vector(void doSendString(String, bool)): java.util.Map:containsKey(...)@938: {0}, {1}
		callDataOut(line, fromParser);
		out.printf("%s\r\n", line);
		final String[] newLine = tokeniseLine(line);
    //#IRCParser.java:924: Warning: unused assignment in callee
    //#    Unused assignment to (java.lang.String:split(...)._tainted) in tokeniseLine
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void doSendString(String, bool)
		if (newLine[0].equalsIgnoreCase("away") && newLine.length > 1) {
    //#IRCParser.java:925: ?use of default init
    //#    init'ed(newLine[0])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void doSendString(String, bool)
    //#    basic block: bb_4
    //#    assertion: init'ed(newLine[0])
    //#    VN: newLine[0]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:925: ?null dereference
    //#    newLine[0] != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void doSendString(String, bool)
    //#    basic block: bb_4
    //#    assertion: newLine[0] != null
    //#    VN: newLine[0]
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
			cMyself.setAwayReason(newLine[newLine.length-1]);
    //#IRCParser.java:926: ?use of default init
    //#    init'ed(newLine[(newLine.length - 1)])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void doSendString(String, bool)
    //#    basic block: bb_6
    //#    assertion: init'ed(newLine[(newLine.length - 1)])
    //#    VN: newLine[newLine.length - 1]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
		} else if (newLine[0].equalsIgnoreCase("mode") && newLine.length == 3) {
			// This makes sure we don't add the same item to the LMQ twice, even if its requested twice,
			// as the ircd will only reply once.
			final LinkedList<Character> foundModes = new LinkedList<Character>();

			final ChannelInfo channel = getChannelInfo(newLine[1]);
    //#IRCParser.java:932: ?use of default init
    //#    init'ed(newLine[1])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void doSendString(String, bool)
    //#    basic block: bb_9
    //#    assertion: init'ed(newLine[1])
    //#    VN: newLine[1]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid  Uncertain
    //#IRCParser.java:932: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCParser.getChannelInfo: sWhat != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void doSendString(String, bool)
    //#    basic block: bb_9
    //#    assertion: newLine[1] != null
    //#    callee: ChannelInfo com/dmdirc/parser/irc/IRCParser.getChannelInfo(String)
    //#    callee assertion: sWhat != null
    //#    callee file: IRCParser.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 894
    //#    VN: newLine[1]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad  Uncertain
			if (channel != null) {
				final Queue<Character> listModeQueue = channel.getListModeQueue();
    //#IRCParser.java:934: ?use of default init
    //#    init'ed(channel.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void doSendString(String, bool)
    //#    basic block: bb_10
    //#    assertion: init'ed(channel.__Tag)
    //#    VN: channel.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:934: ?null dereference
    //#    com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[channel.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void doSendString(String, bool)
    //#    basic block: bb_10
    //#    assertion: com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[channel.__Tag] != null
    //#    VN: com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[channel.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
				for (int i = 0; i < newLine[2].length() ; ++i) {
    //#IRCParser.java:935: ?use of default init
    //#    init'ed(newLine[2])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void doSendString(String, bool)
    //#    basic block: bb_11
    //#    assertion: init'ed(newLine[2])
    //#    VN: newLine[2]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid  Uncertain
    //#IRCParser.java:935: ?null dereference
    //#    newLine[2] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void doSendString(String, bool)
    //#    basic block: bb_11
    //#    assertion: newLine[2] != null
    //#    VN: newLine[2]
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad  Uncertain
					final Character mode = newLine[2].charAt(i);
					callDebugInfo(DEBUG_LMQ, "Intercepted mode request for "+channel+" for mode "+mode);
					if (hChanModesOther.containsKey(mode) && hChanModesOther.get(mode) == MODE_LIST) {
						if (foundModes.contains(mode)) {
							callDebugInfo(DEBUG_LMQ, "Already added to LMQ");
						} else {
							listModeQueue.offer(mode);
    //#IRCParser.java:942: ?null dereference
    //#    listModeQueue != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void doSendString(String, bool)
    //#    basic block: bb_16
    //#    assertion: listModeQueue != null
    //#    VN: result
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
							foundModes.offer(mode);
							callDebugInfo(DEBUG_LMQ, "Added to LMQ");
						}
					}
				}
			}
		}
	}
    //#IRCParser.java:950: end of method: void com.dmdirc.parser.irc.IRCParser.doSendString(String, bool)

	/**
	 * Get the network name given in 005.
	 *
	 * @return network name from 005
	 */
	public String getNetworkName() {
		return sNetworkName;
    //#IRCParser.java:958: method: String com.dmdirc.parser.irc.IRCParser.getNetworkName()
    //#input(String getNetworkName()): this
    //#input(String getNetworkName()): this.sNetworkName
    //#output(String getNetworkName()): return_value
    //#pre[2] (String getNetworkName()): init'ed(this.sNetworkName)
    //#post(String getNetworkName()): return_value == this.sNetworkName
    //#post(String getNetworkName()): init'ed(return_value)
    //#IRCParser.java:958: end of method: String com.dmdirc.parser.irc.IRCParser.getNetworkName()
	}

	/**
	 * Get the server name given in 001.
	 *
	 * @return server name from 001
	 */
	public String getServerName() {
		return sServerName;
    //#IRCParser.java:967: method: String com.dmdirc.parser.irc.IRCParser.getServerName()
    //#input(String getServerName()): this
    //#input(String getServerName()): this.sServerName
    //#output(String getServerName()): return_value
    //#pre[2] (String getServerName()): init'ed(this.sServerName)
    //#post(String getServerName()): return_value == this.sServerName
    //#post(String getServerName()): init'ed(return_value)
    //#IRCParser.java:967: end of method: String com.dmdirc.parser.irc.IRCParser.getServerName()
	}

	/**
	 * Get the last line of input recieved from the server.
	 *
	 * @return the last line of input recieved from the server.
	 */
	public String getLastLine() {
		return lastLine;
    //#IRCParser.java:976: method: String com.dmdirc.parser.irc.IRCParser.getLastLine()
    //#input(String getLastLine()): this
    //#input(String getLastLine()): this.lastLine
    //#output(String getLastLine()): return_value
    //#pre[2] (String getLastLine()): init'ed(this.lastLine)
    //#post(String getLastLine()): return_value == this.lastLine
    //#post(String getLastLine()): init'ed(return_value)
    //#IRCParser.java:976: end of method: String com.dmdirc.parser.irc.IRCParser.getLastLine()
	}

	/**
	 * Process a line and call relevent methods for handling.
	 *
	 * @param line IRC Line to process
	 */
	protected void processLine(final String line) {
		callDataIn(line);
    //#IRCParser.java:985: method: void com.dmdirc.parser.irc.IRCParser.processLine(String)
    //#input(void processLine(String)): " for mode "._tainted
    //#input(void processLine(String)): "Callback not found: "._tainted
    //#input(void processLine(String)): "Exception in Processor. ["._tainted
    //#input(void processLine(String)): "Intercepted mode request for "._tainted
    //#input(void processLine(String)): "No processors will handle "._tainted
    //#input(void processLine(String)): "Notice Auth"._tainted
    //#input(void processLine(String)): "OnDataIn"._tainted
    //#input(void processLine(String)): "OnDataOut"._tainted
    //#input(void processLine(String)): "OnDebugInfo"._tainted
    //#input(void processLine(String)): "OnErrorInfo"._tainted
    //#input(void processLine(String)): "OnNumeric"._tainted
    //#input(void processLine(String)): "OnPingSuccess"._tainted
    //#input(void processLine(String)): "OnPost005"._tainted
    //#input(void processLine(String)): "OnServerError"._tainted
    //#input(void processLine(String)): "PONG :"._tainted
    //#input(void processLine(String)): "]: "._tainted
    //#input(void processLine(String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void processLine(String)): __Descendant_Table[others]
    //#input(void processLine(String)): __Dispatch_Table.callDataIn(Ljava/lang/String;)Z
    //#input(void processLine(String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void processLine(String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void processLine(String)): __Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#input(void processLine(String)): __Dispatch_Table.callPingSuccess()Z
    //#input(void processLine(String)): __Dispatch_Table.callPost005()Z
    //#input(void processLine(String)): __Dispatch_Table.callServerError(Ljava/lang/String;)Z
    //#input(void processLine(String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void processLine(String)): __Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#input(void processLine(String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void processLine(String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void processLine(String)): __Dispatch_Table.getLastLine()Ljava/lang/String;
    //#input(void processLine(String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void processLine(String)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void processLine(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void processLine(String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void processLine(String)): com/dmdirc/parser/irc/IRCProcessor.__Descendant_Table[others]
    //#input(void processLine(String)): com/dmdirc/parser/irc/IRCProcessor.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void processLine(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void processLine(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void processLine(String)): com/dmdirc/parser/irc/Process001.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/Process004005.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/Process464.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessAway.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessInvite.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessJoin.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessKick.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessListModes.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessMOTD.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessMessage.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessMode.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessNames.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessNick.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessNickInUse.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessNoticeAuth.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessPart.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessQuit.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessTopic.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessWallops.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessWho.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessingManager.__Descendant_Table[com/dmdirc/parser/irc/ProcessingManager]
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessingManager.__Descendant_Table[others]
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessingManager.__Dispatch_Table.callNumeric(I[Ljava/lang/String;)Z
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessingManager.__Dispatch_Table.getProcessor(Ljava/lang/String;)Lcom/dmdirc/parser/irc/IRCProcessor;
    //#input(void processLine(String)): com/dmdirc/parser/irc/ProcessingManager.__Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#input(void processLine(String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void processLine(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void processLine(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void processLine(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void processLine(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void processLine(String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void processLine(String)): line
    //#input(void processLine(String)): line._tainted
    //#input(void processLine(String)): this
    //#input(void processLine(String)): this...__Tag
    //#input(void processLine(String)): this...lastLine
    //#input(void processLine(String)): this...myCallbackManager
    //#input(void processLine(String)): this...myCallbackManager.callbackHash
    //#input(void processLine(String)): this.__Tag
    //#input(void processLine(String)): this.cMyself
    //#input(void processLine(String)): this.currentSocketState
    //#input(void processLine(String)): this.got001
    //#input(void processLine(String)): this.hChanModesOther
    //#input(void processLine(String)): this.hChannelList
    //#input(void processLine(String)): this.lastLine
    //#input(void processLine(String)): this.lastPingValue
    //#input(void processLine(String)): this.myCallbackManager
    //#input(void processLine(String)): this.myCallbackManager.callbackHash
    //#input(void processLine(String)): this.myProcessingManager
    //#input(void processLine(String)): this.myProcessingManager.__Tag
    //#input(void processLine(String)): this.myProcessingManager.myParser
    //#input(void processLine(String)): this.myProcessingManager.processHash
    //#input(void processLine(String)): this.out
    //#input(void processLine(String)): this.pingNeeded
    //#input(void processLine(String)): this.pingTime
    //#input(void processLine(String)): this.post005
    //#input(void processLine(String)): this.stringConverter
    //#input(void processLine(String)): this.stringConverter.__Tag
    //#input(void processLine(String)): this.stringConverter.lowercase
    //#input(void processLine(String)): this.stringConverter.lowercase.length
    //#input(void processLine(String)): this.stringConverter.lowercase[0..65_535]
    //#output(void processLine(String)): java.lang.String:substring(...)._tainted
    //#output(void processLine(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void processLine(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void processLine(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void processLine(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void processLine(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void processLine(String)): new char[](IRCStringConverter#1) num objects
    //#output(void processLine(String)): new char[](IRCStringConverter#1).length
    //#output(void processLine(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void processLine(String)): new char[](IRCStringConverter#2) num objects
    //#output(void processLine(String)): new char[](IRCStringConverter#2).length
    //#output(void processLine(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void processLine(String)): this.cMyself.myAwayReason
    //#output(void processLine(String)): this.lastPingValue
    //#output(void processLine(String)): this.post005
    //#output(void processLine(String)): this.serverLag
    //#output(void processLine(String)): this.stringConverter
    //#new obj(void processLine(String)): java.lang.String:substring(...)
    //#new obj(void processLine(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void processLine(String)): new char[](IRCStringConverter#1)
    //#new obj(void processLine(String)): new char[](IRCStringConverter#2)
    //#pre[14] (void processLine(String)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[22] (void processLine(String)): this.myCallbackManager != null
    //#pre[23] (void processLine(String)): this.myCallbackManager.callbackHash != null
    //#pre[29] (void processLine(String)): this.pingNeeded != null
    //#pre[4] (void processLine(String)): (soft) this.lastPingValue != null
    //#pre[5] (void processLine(String)): (soft) init'ed(this.post005)
    //#pre[7] (void processLine(String)): (soft) init'ed(this.stringConverter)
    //#pre[9] (void processLine(String)): (soft) this...__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[10] (void processLine(String)): (soft) init'ed(this...lastLine)
    //#pre[11] (void processLine(String)): (soft) this...myCallbackManager != null
    //#pre[12] (void processLine(String)): (soft) this...myCallbackManager.callbackHash != null
    //#pre[15] (void processLine(String)): (soft) this.cMyself != null
    //#pre[16] (void processLine(String)): (soft) init'ed(this.currentSocketState)
    //#pre[17] (void processLine(String)): (soft) init'ed(this.got001)
    //#pre[18] (void processLine(String)): (soft) this.hChanModesOther != null
    //#pre[19] (void processLine(String)): (soft) this.hChannelList != null
    //#pre[21] (void processLine(String)): (soft) init'ed(this.lastLine)
    //#pre[24] (void processLine(String)): (soft) this.myProcessingManager != null
    //#pre[25] (void processLine(String)): (soft) this.myProcessingManager.__Tag == com/dmdirc/parser/irc/ProcessingManager
    //#pre[26] (void processLine(String)): (soft) this.myProcessingManager.myParser != null
    //#pre[27] (void processLine(String)): (soft) this.myProcessingManager.processHash != null
    //#pre[28] (void processLine(String)): (soft) init'ed(this.out)
    //#pre[30] (void processLine(String)): (soft) init'ed(this.pingTime)
    //#presumption(void processLine(String)): java.lang.System:currentTimeMillis(...)@1002 - this.pingTime in {-9_223_372_036_854_775_808..18_446_744_073_709_551_615}
    //#presumption(void processLine(String)): token.length <= 4_294_967_295
    //#presumption(void processLine(String)): token[0] != null
    //#presumption(void processLine(String)): token[1] != null
    //#presumption(void processLine(String)): token[3] != null
    //#post(void processLine(String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void processLine(String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void processLine(String)): possibly_updated(this.lastPingValue)
    //#post(void processLine(String)): possibly_updated(this.post005)
    //#post(void processLine(String)): possibly_updated(this.serverLag)
    //#post(void processLine(String)): possibly_updated(this.stringConverter)
    //#post(void processLine(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void processLine(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void processLine(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void processLine(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void processLine(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void processLine(String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void processLine(String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void processLine(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void processLine(String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void processLine(String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void processLine(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.util.concurrent.atomic.AtomicBoolean:set
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void processLine(String)): Effects-of-calling:doSendString
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void processLine(String)): Effects-of-calling:getCallbackType
    //#unanalyzed(void processLine(String)): Effects-of-calling:call
    //#unanalyzed(void processLine(String)): Effects-of-calling:callErrorInfo
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.util.Hashtable:containsKey
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.util.Hashtable:get
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.Exception
    //#unanalyzed(void processLine(String)): Effects-of-calling:getCallbackManager
    //#unanalyzed(void processLine(String)): Effects-of-calling:process
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.Exception:getMessage
    //#unanalyzed(void processLine(String)): Effects-of-calling:getLastLine
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void processLine(String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void processLine(String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void processLine(String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#test_vector(void processLine(String)): this.post005: {1}, {0}
    //#test_vector(void processLine(String)): this.got001: {0}, {1}
    //#test_vector(void processLine(String)): java.lang.Integer:parseInt(...)@1018: {0..5}, {6..4_294_967_295}
    //#test_vector(void processLine(String)): java.lang.String:charAt(...)@1037: {0, 2..65_535}, {1}
    //#test_vector(void processLine(String)): java.lang.String:equals(...)@1000: {0}, {1}
    //#test_vector(void processLine(String)): java.lang.String:equalsIgnoreCase(...)@1005: {0}, {1}
    //#test_vector(void processLine(String)): java.lang.String:equalsIgnoreCase(...)@1013: {0}, {1}
    //#test_vector(void processLine(String)): java.lang.String:equalsIgnoreCase(...)@997: {1}, {0}
    //#test_vector(void processLine(String)): java.lang.String:equalsIgnoreCase(...)@997: {0}, {1}
    //#test_vector(void processLine(String)): java.lang.String:equalsIgnoreCase(...)@999: {1}, {0}
    //#test_vector(void processLine(String)): java.lang.String:equalsIgnoreCase(...)@999: {0}, {1}
    //#test_vector(void processLine(String)): java.lang.String:isEmpty(...)@1000: {1}, {0}
    //#test_vector(void processLine(String)): java.lang.String:isEmpty(...)@1037: {1}, {0}

		final String[] token = tokeniseLine(line);
    //#IRCParser.java:987: Warning: unused assignment in callee
    //#    Unused assignment to (java.lang.String:split(...)._tainted) in tokeniseLine
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void processLine(String)
		int nParam;
		setPingNeeded(false);
//		pingCountDown = pingCountDownLength;

		if (token.length < 2) {
			return;
		}
		try {
			final String sParam = token[1];
    //#IRCParser.java:996: ?use of default init
    //#    init'ed(token[1])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void processLine(String)
    //#    basic block: bb_4
    //#    assertion: init'ed(token[1])
    //#    VN: token[1]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid  Uncertain
			if (token[0].equalsIgnoreCase("PING") || token[1].equalsIgnoreCase("PING")) {
    //#IRCParser.java:997: ?null dereference
    //#    token[0] != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void processLine(String)
    //#    basic block: bb_4
    //#    assertion: token[0] != null
    //#    VN: token[0]
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:997: ?null dereference
    //#    token[1] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void processLine(String)
    //#    basic block: bb_5
    //#    assertion: token[1] != null
    //#    VN: token[1]
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad  Uncertain
				sendString("PONG :" + sParam);
			} else if (token[0].equalsIgnoreCase("PONG") || token[1].equalsIgnoreCase("PONG")) {
				if (!lastPingValue.isEmpty() && lastPingValue.equals(token[token.length-1])) {
    //#IRCParser.java:1000: ?use of default init
    //#    init'ed(token[(token.length - 1)])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void processLine(String)
    //#    basic block: bb_10
    //#    assertion: init'ed(token[(token.length - 1)])
    //#    VN: token[token.length - 1]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
					lastPingValue = "";
					serverLag = System.currentTimeMillis() - pingTime;
					callPingSuccess();
				}
			} else if (token[0].equalsIgnoreCase("ERROR")) {
				final StringBuilder errorMessage = new StringBuilder();
				for (int i = 1; i < token.length; ++i) { errorMessage.append(token[i]); }
    //#IRCParser.java:1007: ?use of default init
    //#    init'ed(token[i])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void processLine(String)
    //#    basic block: bb_15
    //#    assertion: init'ed(token[i])
    //#    VN: token[i]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid  Uncertain
				callServerError(errorMessage.toString());
			} else {
				if (got001) {
					// Freenode sends a random notice in a stupid place, others might do aswell
					// These shouldn't cause post005 to be fired, so handle them here.
					if (token[0].equalsIgnoreCase("NOTICE")) {
						try { myProcessingManager.process("Notice Auth", token); } catch (ProcessorNotFoundException e) { }
						return;
					}
					if (!post005) {
						try { nParam = Integer.parseInt(token[1]); } catch (NumberFormatException e) { nParam = -1; }
						if (nParam < 0 || nParam > 5) {
							callPost005();
						}
					}
					// After 001 we potentially care about everything!
					try { myProcessingManager.process(sParam, token); }
					catch (ProcessorNotFoundException e) { }
				} else {
					// Before 001 we don't care about much.
					try { nParam = Integer.parseInt(token[1]); } catch (NumberFormatException e) { nParam = -1; }
					switch (nParam) {
						case 1: // 001 - Welcome to IRC
						case 464: // Password Required
						case 433: // Nick In Use
							try { myProcessingManager.process(sParam, token); } catch (ProcessorNotFoundException e) { }
							break;
						default: // Unknown - Send to Notice Auth
							// Some networks send a CTCP during the auth process, handle it
							if (token.length > 3 && !token[3].isEmpty() && token[3].charAt(0) == (char)1 && token[3].charAt(token[3].length()-1) == (char)1) {
    //#IRCParser.java:1037: ?null dereference
    //#    token[3] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void processLine(String)
    //#    basic block: bb_42
    //#    assertion: token[3] != null
    //#    VN: token[3]
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad  Uncertain
								try { myProcessingManager.process(sParam, token); } catch (ProcessorNotFoundException e) { }
								break;
							}
							// Some networks may send a NICK message if you nick change before 001
							// Eat it up so that it isn't treated as a notice auth.
							if (token[1].equalsIgnoreCase("NICK")) { break; }
							
							// Otherwise, send to Notice Auth
							try { myProcessingManager.process("Notice Auth", token); } catch (ProcessorNotFoundException e) { }
							break;
					}
				}
			}
		} catch (Exception e) {
			final ParserError ei = new ParserError(ParserError.ERROR_FATAL, "Fatal Exception in Parser.", getLastLine());
			ei.setException(e);
			callErrorInfo(ei);
		}
	}
    //#IRCParser.java:1056: end of method: void com.dmdirc.parser.irc.IRCParser.processLine(String)

	/** The IRCStringConverter for this parser */
	private IRCStringConverter stringConverter = null;
    //#IRCParser.java:1059: end of method: void com.dmdirc.parser.irc.IRCParser.com.dmdirc.parser.irc.IRCParser(MyInfo, ServerInfo)

	/**
	 * Get the IRCStringConverter used by this parser.
	 *
	 * @return the IRCStringConverter used by this parser. (will create a default
	 *         one if none exists already);
	 */
	public IRCStringConverter getIRCStringConverter() {
		if (stringConverter == null) {
    //#IRCParser.java:1068: method: IRCStringConverter com.dmdirc.parser.irc.IRCParser.getIRCStringConverter()
    //#input(IRCStringConverter getIRCStringConverter()): this
    //#input(IRCStringConverter getIRCStringConverter()): this.stringConverter
    //#output(IRCStringConverter getIRCStringConverter()): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(IRCStringConverter getIRCStringConverter()): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(IRCStringConverter getIRCStringConverter()): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(IRCStringConverter getIRCStringConverter()): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(IRCStringConverter getIRCStringConverter()): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(IRCStringConverter getIRCStringConverter()): new char[](IRCStringConverter#1) num objects
    //#output(IRCStringConverter getIRCStringConverter()): new char[](IRCStringConverter#1).length
    //#output(IRCStringConverter getIRCStringConverter()): new char[](IRCStringConverter#1)[0..65_535]
    //#output(IRCStringConverter getIRCStringConverter()): new char[](IRCStringConverter#2) num objects
    //#output(IRCStringConverter getIRCStringConverter()): new char[](IRCStringConverter#2).length
    //#output(IRCStringConverter getIRCStringConverter()): new char[](IRCStringConverter#2)[0..65_567]
    //#output(IRCStringConverter getIRCStringConverter()): return_value
    //#output(IRCStringConverter getIRCStringConverter()): this.stringConverter
    //#new obj(IRCStringConverter getIRCStringConverter()): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(IRCStringConverter getIRCStringConverter()): new char[](IRCStringConverter#1)
    //#new obj(IRCStringConverter getIRCStringConverter()): new char[](IRCStringConverter#2)
    //#pre[1] (IRCStringConverter getIRCStringConverter()): init'ed(this.stringConverter)
    //#post(IRCStringConverter getIRCStringConverter()): return_value == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(IRCStringConverter getIRCStringConverter()): return_value != null
    //#post(IRCStringConverter getIRCStringConverter()): this.stringConverter == return_value
    //#post(IRCStringConverter getIRCStringConverter()): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(IRCStringConverter getIRCStringConverter()): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(IRCStringConverter getIRCStringConverter()): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(IRCStringConverter getIRCStringConverter()): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(IRCStringConverter getIRCStringConverter()): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(IRCStringConverter getIRCStringConverter()): new char[](IRCStringConverter#1) num objects <= 1
    //#post(IRCStringConverter getIRCStringConverter()): new char[](IRCStringConverter#1).length == 127
    //#post(IRCStringConverter getIRCStringConverter()): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(IRCStringConverter getIRCStringConverter()): new char[](IRCStringConverter#2) num objects <= 1
    //#post(IRCStringConverter getIRCStringConverter()): new char[](IRCStringConverter#2).length == 127
    //#post(IRCStringConverter getIRCStringConverter()): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#test_vector(IRCStringConverter getIRCStringConverter()): this.stringConverter: Inverse{null}, Addr_Set{null}
			stringConverter = new IRCStringConverter((byte)4);
		}
		return stringConverter;
    //#IRCParser.java:1071: end of method: IRCStringConverter com.dmdirc.parser.irc.IRCParser.getIRCStringConverter()
	}

	/**
	 * Update the character arrays.
	 *
	 * @param limit Number of post-alphabetical characters to convert
	 *              0 = ascii encoding
	 *              3 = strict-rfc1459 encoding
	 *              4 = rfc1459 encoding
	 */
	protected void updateCharArrays(final byte limit) {
		stringConverter = new IRCStringConverter(limit);
    //#IRCParser.java:1083: method: void com.dmdirc.parser.irc.IRCParser.updateCharArrays(byte)
    //#input(void updateCharArrays(byte)): limit
    //#input(void updateCharArrays(byte)): this
    //#output(void updateCharArrays(byte)): new IRCStringConverter(updateCharArrays#1) num objects
    //#output(void updateCharArrays(byte)): this.stringConverter.__Tag
    //#output(void updateCharArrays(byte)): this.stringConverter.limit
    //#output(void updateCharArrays(byte)): this.stringConverter.lowercase
    //#output(void updateCharArrays(byte)): this.stringConverter.uppercase
    //#output(void updateCharArrays(byte)): new char[](IRCStringConverter#1) num objects
    //#output(void updateCharArrays(byte)): new char[](IRCStringConverter#1).length
    //#output(void updateCharArrays(byte)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void updateCharArrays(byte)): new char[](IRCStringConverter#2) num objects
    //#output(void updateCharArrays(byte)): new char[](IRCStringConverter#2).length
    //#output(void updateCharArrays(byte)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void updateCharArrays(byte)): this.stringConverter
    //#new obj(void updateCharArrays(byte)): new IRCStringConverter(updateCharArrays#1)
    //#new obj(void updateCharArrays(byte)): new char[](IRCStringConverter#1)
    //#new obj(void updateCharArrays(byte)): new char[](IRCStringConverter#2)
    //#post(void updateCharArrays(byte)): this.stringConverter == &new IRCStringConverter(updateCharArrays#1)
    //#post(void updateCharArrays(byte)): new IRCStringConverter(updateCharArrays#1) num objects == 1
    //#post(void updateCharArrays(byte)): new char[](IRCStringConverter#1) num objects == 1
    //#post(void updateCharArrays(byte)): new char[](IRCStringConverter#2) num objects == 1
    //#post(void updateCharArrays(byte)): this.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void updateCharArrays(byte)): this.stringConverter.limit == One-of{4, limit}
    //#post(void updateCharArrays(byte)): this.stringConverter.limit in {0..4}
    //#post(void updateCharArrays(byte)): this.stringConverter.lowercase == &new char[](IRCStringConverter#1)
    //#post(void updateCharArrays(byte)): this.stringConverter.uppercase == &new char[](IRCStringConverter#2)
    //#post(void updateCharArrays(byte)): new char[](IRCStringConverter#1).length == 127
    //#post(void updateCharArrays(byte)): new char[](IRCStringConverter#2).length == 127
    //#post(void updateCharArrays(byte)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void updateCharArrays(byte)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
	}
    //#IRCParser.java:1084: end of method: void com.dmdirc.parser.irc.IRCParser.updateCharArrays(byte)

	/**
	 * Get the known boolean chanmodes in 005 order.
	 * Modes are returned in the order that the ircd specifies the modes in 005
	 * with any newly-found modes (mode being set that wasn't specified in 005)
	 * being added at the end.
	 *
	 * @return All the currently known boolean modes
	 */
	public String getBoolChanModes005() {
		// This code isn't the nicest, as Hashtable's don't lend themselves to being
		// ordered.
		// Order isn't really important, and this code only takes 3 lines of we
		// don't care about it but ordered guarentees that on a specific ircd this
		// method will ALWAYs return the same value.
		final char[] modes = new char[hChanModesBool.size()];
    //#IRCParser.java:1100: method: String com.dmdirc.parser.irc.IRCParser.getBoolChanModes005()
    //#input(String getBoolChanModes005()): this
    //#input(String getBoolChanModes005()): this.hChanModesBool
    //#output(String getBoolChanModes005()): new String(getBoolChanModes005#2) num objects
    //#output(String getBoolChanModes005()): return_value
    //#new obj(String getBoolChanModes005()): new String(getBoolChanModes005#2)
    //#pre[2] (String getBoolChanModes005()): this.hChanModesBool != null
    //#presumption(String getBoolChanModes005()): (int) (java.lang.Math:log(...)@1108/java.lang.Math:log(...)@1108) in {0..4_294_967_294}
    //#presumption(String getBoolChanModes005()): java.lang.Math:log(...)@1108 != +0
    //#presumption(String getBoolChanModes005()): java.util.Iterator:next(...)@1104 != null
    //#presumption(String getBoolChanModes005()): java.util.Map:get(...)@1105 != null
    //#presumption(String getBoolChanModes005()): java.util.Map:keySet(...)@1104 != null
    //#presumption(String getBoolChanModes005()): java.util.Map:size(...)@1100 >= 1
    //#presumption(String getBoolChanModes005()): java.util.Map:size(...)@1100 - (int) (java.lang.Math:log(...)@1108/java.lang.Math:log(...)@1108) in {1..4_294_967_295}
    //#post(String getBoolChanModes005()): return_value == &new String(getBoolChanModes005#2)
    //#post(String getBoolChanModes005()): new String(getBoolChanModes005#2) num objects == 1
    //#test_vector(String getBoolChanModes005()): java.lang.Long:longValue(...)@1105: {-9_223_372_036_854_775_808..0}, {1..18_446_744_073_709_551_615}
    //#test_vector(String getBoolChanModes005()): java.util.Iterator:hasNext(...)@1104: {0}, {1}
		long nTemp;
		double pos;

		for (char cTemp : hChanModesBool.keySet()) {
			nTemp = hChanModesBool.get(cTemp);
			// nTemp should never be less than 0
			if (nTemp > 0) {
				pos = Math.log(nTemp) / Math.log(2);
				modes[(int)pos] = cTemp;
			}
/*			// Is there an easier way to find out the power of 2 value for a number?
			// ie 1024 = 10, 512 = 9 ?
			for (int i = 0; i < modes.length; i++) {
				if (Math.pow(2, i) == (double) nTemp) {
					modes[i] = cTemp;
					break;
				}
			}*/
		}
		return new String(modes);
    //#IRCParser.java:1120: end of method: String com.dmdirc.parser.irc.IRCParser.getBoolChanModes005()
	}

	/**
	 * Process CHANMODES from 005.
	 */
	public void parseChanModes() {
		final StringBuilder sDefaultModes = new StringBuilder("b,k,l,");
    //#IRCParser.java:1127: method: void com.dmdirc.parser.irc.IRCParser.parseChanModes()
    //#IRCParser.java:1127: ?check always fails: method fails for all possible inputs: void parseChanModes().
    //#input(void parseChanModes()): """._tainted
    //#input(void parseChanModes()): "CHANMODES String not valid. Using default string of ""._tainted
    //#input(void parseChanModes()): "Callback not found: "._tainted
    //#input(void parseChanModes()): "OnDebugInfo"._tainted
    //#input(void parseChanModes()): "OnErrorInfo"._tainted
    //#input(void parseChanModes()): "b,k,l,"._tainted
    //#input(void parseChanModes()): "imnpstrc"._tainted
    //#input(void parseChanModes()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void parseChanModes()): __Descendant_Table[others]
    //#input(void parseChanModes()): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void parseChanModes()): __Dispatch_Table.callDebugInfo(ILjava/lang/String;[Ljava/lang/Object;)Z
    //#input(void parseChanModes()): __Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#input(void parseChanModes()): __Dispatch_Table.getIRCD(Z)Ljava/lang/String;
    //#input(void parseChanModes()): __Dispatch_Table.getLastLine()Ljava/lang/String;
    //#input(void parseChanModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void parseChanModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void parseChanModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void parseChanModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void parseChanModes()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void parseChanModes()): this
    //#input(void parseChanModes()): this.__Tag
    //#input(void parseChanModes()): this.h005Info
    //#input(void parseChanModes()): this.hChanModesBool
    //#input(void parseChanModes()): this.hChanModesOther
    //#input(void parseChanModes()): this.hPrefixModes
    //#input(void parseChanModes()): this.lastLine
    //#input(void parseChanModes()): this.myCallbackManager
    //#input(void parseChanModes()): this.myCallbackManager.callbackHash
    //#input(void parseChanModes()): this.sNetworkName
    //#output(void parseChanModes()): this.nNextKeyCMBool
    //#pre[2] (void parseChanModes()): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[3] (void parseChanModes()): this.h005Info != null
    //#pre[4] (void parseChanModes()): this.hChanModesBool != null
    //#pre[5] (void parseChanModes()): this.hChanModesOther != null
    //#pre[7] (void parseChanModes()): init'ed(this.lastLine)
    //#pre[8] (void parseChanModes()): this.myCallbackManager != null
    //#pre[9] (void parseChanModes()): this.myCallbackManager.callbackHash != null
    //#pre[6] (void parseChanModes()): (soft) this.hPrefixModes != null
    //#pre[10] (void parseChanModes()): (soft) this.sNetworkName != null
    //#presumption(void parseChanModes()): java.lang.String:length(...)@1175 >= 1
    //#presumption(void parseChanModes()): java.lang.String:length(...)@1182 >= 1
    //#presumption(void parseChanModes()): java.lang.String:length(...)@1189 >= 1
    //#presumption(void parseChanModes()): java.util.Map:get(...)@1136 != null
    //#presumption(void parseChanModes()): java.util.Map:get(...)@1148 != null
    //#post(void parseChanModes()): this.nNextKeyCMBool <= 18_446_744_073_709_551_614
    //#unanalyzed(void parseChanModes()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void parseChanModes()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void parseChanModes()): Effects-of-calling:java.lang.String:matches
    //#unanalyzed(void parseChanModes()): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void parseChanModes()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void parseChanModes()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void parseChanModes()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void parseChanModes()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void parseChanModes()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void parseChanModes()): Effects-of-calling:call
    //#unanalyzed(void parseChanModes()): Effects-of-calling:callDebugInfo
    //#unanalyzed(void parseChanModes()): Effects-of-calling:java.lang.String:format
    //#unanalyzed(void parseChanModes()): Effects-of-calling:java.lang.Integer:valueOf
    //#test_vector(void parseChanModes()): java.lang.String:equalsIgnoreCase(...)@1131: {0}, {1}
    //#test_vector(void parseChanModes()): java.lang.String:equalsIgnoreCase(...)@1133: {0}, {1}
    //#test_vector(void parseChanModes()): java.lang.StringBuilder:indexOf(...)@1140: {0..4_294_967_295}, {-2_147_483_648..-1}
    //#test_vector(void parseChanModes()): java.util.Map:containsKey(...)@1130: {0}, {1}
    //#test_vector(void parseChanModes()): java.util.Map:containsKey(...)@1140: {1}, {0}
    //#test_vector(void parseChanModes()): java.util.Map:containsKey(...)@1147: {0}, {1}
    //#test_vector(void parseChanModes()): java.util.Map:containsKey(...)@1170: {1}, {0}
    //#test_vector(void parseChanModes()): java.util.Map:containsKey(...)@1178: {1}, {0}
    //#test_vector(void parseChanModes()): java.util.Map:containsKey(...)@1185: {1}, {0}
    //#test_vector(void parseChanModes()): java.util.Map:containsKey(...)@1192: {1}, {0}
		String[] bits = null;
    //#IRCParser.java:1128: Warning: unused assignment
    //#    Unused assignment into bits
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    Attribs:  Uncertain
		String modeStr;
		if (h005Info.containsKey("USERCHANMODES")) {
			if (getIRCD(true).equalsIgnoreCase("dancer")) {
				sDefaultModes.insert(0, "dqeI");
			} else if (getIRCD(true).equalsIgnoreCase("austirc")) {
				sDefaultModes.insert(0, "e");
			}
			modeStr = h005Info.get("USERCHANMODES");
			char mode;
			for (int i = 0; i < modeStr.length(); ++i) {
				mode = modeStr.charAt(i);
				if (!hPrefixModes.containsKey(mode) && sDefaultModes.indexOf(Character.toString(mode)) < 0) {
					sDefaultModes.append(mode);
				}
			}
		} else {
			sDefaultModes.append("imnpstrc");
		}
		if (h005Info.containsKey("CHANMODES")) {
			modeStr = h005Info.get("CHANMODES");
		} else {
			modeStr = sDefaultModes.toString();
			h005Info.put("CHANMODES", modeStr);
		}
		bits = modeStr.split(",", 5);
		if (bits.length < 4) {
    //#IRCParser.java:1154: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_17
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1154: Warning: test always goes same way
    //#    Test predetermined because bits.length == 0
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    from bb: bb_17
    //#    live edge: bb_17-->bb_18
    //#    tested vn: undefined - 4
    //#    tested vn values: {-4}
			modeStr = sDefaultModes.toString();
			callErrorInfo(new ParserError(ParserError.ERROR_ERROR, "CHANMODES String not valid. Using default string of \"" + modeStr + "\"", getLastLine()));
			h005Info.put("CHANMODES", modeStr);
			bits = modeStr.split(",", 5);
		}

		// resetState
		hChanModesOther.clear();
		hChanModesBool.clear();
		nNextKeyCMBool = 1;

		// List modes.
		for (int i = 0; i < bits[0].length(); ++i) {
    //#IRCParser.java:1167: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_20
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1167: ?use of default init
    //#    init'ed(bits[0])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_20
    //#    assertion: init'ed(bits[0])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:1167: ?null dereference
    //#    not_init'ed(bits[0])
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_20
    //#    assertion: not_init'ed(bits[0])
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
			final Character cMode = bits[0].charAt(i);
    //#IRCParser.java:1168: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_21
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1168: ?use of default init
    //#    init'ed(bits[0])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_21
    //#    assertion: init'ed(bits[0])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:1168: ?null dereference
    //#    not_init'ed(bits[0])
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_21
    //#    assertion: not_init'ed(bits[0])
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
			callDebugInfo(DEBUG_INFO, "Found List Mode: %c", cMode);
			if (!hChanModesOther.containsKey(cMode)) { hChanModesOther.put(cMode, MODE_LIST); }
		}

		// Param for Set and Unset.
		final Byte nBoth = MODE_SET + MODE_UNSET;
		for (int i = 0; i < bits[1].length(); ++i) {
    //#IRCParser.java:1175: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_25
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1175: ?!array index out of bounds
    //#    bits.length >= 2
    //#    severity: HIGH
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_25
    //#    assertion: bits.length >= 2
    //#    VN: undefined - 1
    //#    Expected: {1..+Inf}
    //#    Bad: {-1}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
    //#IRCParser.java:1175: ?use of default init
    //#    init'ed(bits[1])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_25
    //#    assertion: init'ed(bits[1])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:1175: ?null dereference
    //#    not_init'ed(bits[1])
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_25
    //#    assertion: not_init'ed(bits[1])
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:1175: ?use of default init
    //#    init'ed(i)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_28
    //#    assertion: init'ed(i)
    //#    VN: i
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
			final Character cMode = bits[1].charAt(i);
    //#IRCParser.java:1176: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_26
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1176: ?array index out of bounds
    //#    bits.length >= 2
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_26
    //#    assertion: bits.length >= 2
    //#    VN: undefined - 1
    //#    Expected: {1..+Inf}
    //#    Bad: {-Inf..0}
    //#    Attribs:  Int  Bad overlaps +/-1000  Bad < Exp
    //#IRCParser.java:1176: ?use of default init
    //#    init'ed(bits[1])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_26
    //#    assertion: init'ed(bits[1])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:1176: ?null dereference
    //#    not_init'ed(bits[1])
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_26
    //#    assertion: not_init'ed(bits[1])
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:1176: ?use of default init
    //#    init'ed(i)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_26
    //#    assertion: init'ed(i)
    //#    VN: i
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
			callDebugInfo(DEBUG_INFO, "Found Set/Unset Mode: %c", cMode);
    //#IRCParser.java:1177: ?use of default init
    //#    init'ed(new__parseChanModes:Object_array__5.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_26
    //#    assertion: init'ed(new__parseChanModes:Object_array__5.length)
    //#    VN: new Object[](parseChanModes#5) num objects
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
			if (!hChanModesOther.containsKey(cMode)) { hChanModesOther.put(cMode, nBoth); }
		}

		// Param just for Set
		for (int i = 0; i < bits[2].length(); ++i) {
    //#IRCParser.java:1182: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_30
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1182: ?!array index out of bounds
    //#    bits.length >= 3
    //#    severity: HIGH
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_30
    //#    assertion: bits.length >= 3
    //#    VN: undefined - 2
    //#    Expected: {1..+Inf}
    //#    Bad: {-2}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
    //#IRCParser.java:1182: ?use of default init
    //#    init'ed(bits[2])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_30
    //#    assertion: init'ed(bits[2])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:1182: ?null dereference
    //#    not_init'ed(bits[2])
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_30
    //#    assertion: not_init'ed(bits[2])
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:1182: ?use of default init
    //#    init'ed(i)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_33
    //#    assertion: init'ed(i)
    //#    VN: i
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
			final Character cMode = bits[2].charAt(i);
    //#IRCParser.java:1183: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_31
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1183: ?array index out of bounds
    //#    bits.length >= 3
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_31
    //#    assertion: bits.length >= 3
    //#    VN: undefined - 2
    //#    Expected: {1..+Inf}
    //#    Bad: {-Inf..0}
    //#    Attribs:  Int  Bad overlaps +/-1000  Bad < Exp
    //#IRCParser.java:1183: ?use of default init
    //#    init'ed(bits[2])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_31
    //#    assertion: init'ed(bits[2])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:1183: ?null dereference
    //#    not_init'ed(bits[2])
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_31
    //#    assertion: not_init'ed(bits[2])
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:1183: ?use of default init
    //#    init'ed(i)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_31
    //#    assertion: init'ed(i)
    //#    VN: i
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
			callDebugInfo(DEBUG_INFO, "Found Set Only Mode: %c", cMode);
    //#IRCParser.java:1184: ?use of default init
    //#    init'ed(new__parseChanModes:Object_array__6.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_31
    //#    assertion: init'ed(new__parseChanModes:Object_array__6.length)
    //#    VN: new Object[](parseChanModes#6) num objects
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
			if (!hChanModesOther.containsKey(cMode)) { hChanModesOther.put(cMode, MODE_SET); }
		}

		// Boolean Mode
		for (int i = 0; i < bits[3].length(); ++i) {
    //#IRCParser.java:1189: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_35
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1189: ?!array index out of bounds
    //#    bits.length >= 4
    //#    severity: HIGH
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_35
    //#    assertion: bits.length >= 4
    //#    VN: undefined - 3
    //#    Expected: {1..+Inf}
    //#    Bad: {-3}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
    //#IRCParser.java:1189: ?use of default init
    //#    init'ed(bits[3])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_35
    //#    assertion: init'ed(bits[3])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:1189: ?null dereference
    //#    not_init'ed(bits[3])
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_35
    //#    assertion: not_init'ed(bits[3])
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:1189: ?use of default init
    //#    init'ed(i)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_38
    //#    assertion: init'ed(i)
    //#    VN: i
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
			final Character cMode = bits[3].charAt(i);
    //#IRCParser.java:1190: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_36
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1190: ?array index out of bounds
    //#    bits.length >= 4
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_36
    //#    assertion: bits.length >= 4
    //#    VN: undefined - 3
    //#    Expected: {1..+Inf}
    //#    Bad: {-Inf..0}
    //#    Attribs:  Int  Bad overlaps +/-1000  Bad < Exp
    //#IRCParser.java:1190: ?use of default init
    //#    init'ed(bits[3])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_36
    //#    assertion: init'ed(bits[3])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:1190: ?null dereference
    //#    not_init'ed(bits[3])
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_36
    //#    assertion: not_init'ed(bits[3])
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#IRCParser.java:1190: ?use of default init
    //#    init'ed(i)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_36
    //#    assertion: init'ed(i)
    //#    VN: i
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
			callDebugInfo(DEBUG_INFO, "Found Boolean Mode: %c [%d]", cMode, nNextKeyCMBool);
    //#IRCParser.java:1191: ?use of default init
    //#    init'ed(new__parseChanModes:Object_array__7.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_36
    //#    assertion: init'ed(new__parseChanModes:Object_array__7.length)
    //#    VN: new Object[](parseChanModes#7) num objects
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
			if (!hChanModesBool.containsKey(cMode)) {
				hChanModesBool.put(cMode, nNextKeyCMBool);
    //#IRCParser.java:1193: ?use of default init
    //#    init'ed(this.nNextKeyCMBool)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_37
    //#    assertion: init'ed(this.nNextKeyCMBool)
    //#    VN: this.nNextKeyCMBool
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
				nNextKeyCMBool = nNextKeyCMBool * 2;
    //#IRCParser.java:1194: ?overflow
    //#    this.nNextKeyCMBool*2 in {-9_223_372_036_854_775_808..18_446_744_073_709_551_615}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanModes()
    //#    basic block: bb_37
    //#    assertion: this.nNextKeyCMBool*2 in {-9_223_372_036_854_775_808..18_446_744_073_709_551_615}
    //#    VN: this.nNextKeyCMBool*2
    //#    Expected: {-9_223_372_036_854_775_808..18_446_744_073_709_551_615, Invalid}
    //#    Bad: {-18_446_744_073_709_551_616..-9_223_372_036_854_775_809, 18_446_744_073_709_551_616..36_893_488_147_419_103_230}
    //#    Attribs:  Int  Bad < Exp  Bad > Exp
			}
		}
	}
    //#IRCParser.java:1197: end of method: void com.dmdirc.parser.irc.IRCParser.parseChanModes()

	/**
	 * Get the known prefixmodes in priority order.
	 *
	 * @return All the currently known usermodes
	 */
	public String getPrefixModes() {
		if (h005Info.containsKey("PREFIXSTRING")) {
    //#IRCParser.java:1205: method: String com.dmdirc.parser.irc.IRCParser.getPrefixModes()
    //#input(String getPrefixModes()): this
    //#input(String getPrefixModes()): this.h005Info
    //#output(String getPrefixModes()): return_value
    //#pre[2] (String getPrefixModes()): this.h005Info != null
    //#post(String getPrefixModes()): init'ed(return_value)
    //#test_vector(String getPrefixModes()): java.util.Map:containsKey(...)@1205: {0}, {1}
			return h005Info.get("PREFIXSTRING");
		} else {
			return "";
    //#IRCParser.java:1208: end of method: String com.dmdirc.parser.irc.IRCParser.getPrefixModes()
		}
	}

	/**
	 * Get the known boolean chanmodes in alphabetical order.
	 * Modes are returned in alphabetic order
	 *
	 * @return All the currently known boolean modes
	 */
	public String getBoolChanModes() {
		final char[] modes = new char[hChanModesBool.size()];
    //#IRCParser.java:1219: method: String com.dmdirc.parser.irc.IRCParser.getBoolChanModes()
    //#input(String getBoolChanModes()): this
    //#input(String getBoolChanModes()): this.hChanModesBool
    //#output(String getBoolChanModes()): new String(getBoolChanModes#2) num objects
    //#output(String getBoolChanModes()): return_value
    //#new obj(String getBoolChanModes()): new String(getBoolChanModes#2)
    //#pre[2] (String getBoolChanModes()): this.hChanModesBool != null
    //#presumption(String getBoolChanModes()): java.util.Iterator:next(...)@1221 != null
    //#presumption(String getBoolChanModes()): java.util.Map:keySet(...)@1221 != null
    //#presumption(String getBoolChanModes()): java.util.Map:size(...)@1219 >= 1
    //#post(String getBoolChanModes()): return_value == &new String(getBoolChanModes#2)
    //#post(String getBoolChanModes()): new String(getBoolChanModes#2) num objects == 1
    //#test_vector(String getBoolChanModes()): java.util.Iterator:hasNext(...)@1221: {0}, {1}
		int i = 0;
		for (char mode : hChanModesBool.keySet()) {
			modes[i++] = mode;
    //#IRCParser.java:1222: ?overflow
    //#    i in {-2_147_483_649..4_294_967_294}
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: String getBoolChanModes()
    //#    basic block: bb_3
    //#    assertion: i in {-2_147_483_649..4_294_967_294}
    //#    VN: i + 1
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
    //#IRCParser.java:1222: ?array index out of bounds
    //#    i < modes.length
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: String getBoolChanModes()
    //#    basic block: bb_3
    //#    assertion: i < modes.length
    //#    VN: -(i - java.util.Map:size(...)@1219)
    //#    Expected: {1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
		}
		// Alphabetically sort the array
		Arrays.sort(modes);
		return new String(modes);
    //#IRCParser.java:1226: end of method: String com.dmdirc.parser.irc.IRCParser.getBoolChanModes()
	}

	/**
	 * Get the known List chanmodes.
	 * Modes are returned in alphabetical order
	 *
	 * @return All the currently known List modes
	 */
	public String getListChanModes() {
		return getOtherModeString(MODE_LIST);
    //#IRCParser.java:1236: method: String com.dmdirc.parser.irc.IRCParser.getListChanModes()
    //#input(String getListChanModes()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(String getListChanModes()): __Descendant_Table[others]
    //#input(String getListChanModes()): __Dispatch_Table.getOtherModeString(B)Ljava/lang/String;
    //#input(String getListChanModes()): this
    //#input(String getListChanModes()): this.__Tag
    //#input(String getListChanModes()): this.hChanModesOther
    //#output(String getListChanModes()): return_value
    //#pre[2] (String getListChanModes()): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[3] (String getListChanModes()): this.hChanModesOther != null
    //#post(String getListChanModes()): return_value != null
    //#unanalyzed(String getListChanModes()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(String getListChanModes()): Effects-of-calling:java.util.Map:size
    //#unanalyzed(String getListChanModes()): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(String getListChanModes()): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(String getListChanModes()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(String getListChanModes()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(String getListChanModes()): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(String getListChanModes()): Effects-of-calling:java.util.Arrays:sort
    //#unanalyzed(String getListChanModes()): Effects-of-calling:java.lang.String
    //#unanalyzed(String getListChanModes()): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(String getListChanModes()): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(String getListChanModes()): Effects-of-calling:java.lang.String:trim
    //#IRCParser.java:1236: end of method: String com.dmdirc.parser.irc.IRCParser.getListChanModes()
	}

	/**
	 * Get the known Set-Only chanmodes.
	 * Modes are returned in alphabetical order
	 *
	 * @return All the currently known Set-Only modes
	 */
	public String getSetOnlyChanModes() {
		return getOtherModeString(MODE_SET);
    //#IRCParser.java:1246: method: String com.dmdirc.parser.irc.IRCParser.getSetOnlyChanModes()
    //#input(String getSetOnlyChanModes()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(String getSetOnlyChanModes()): __Descendant_Table[others]
    //#input(String getSetOnlyChanModes()): __Dispatch_Table.getOtherModeString(B)Ljava/lang/String;
    //#input(String getSetOnlyChanModes()): this
    //#input(String getSetOnlyChanModes()): this.__Tag
    //#input(String getSetOnlyChanModes()): this.hChanModesOther
    //#output(String getSetOnlyChanModes()): return_value
    //#pre[2] (String getSetOnlyChanModes()): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[3] (String getSetOnlyChanModes()): this.hChanModesOther != null
    //#post(String getSetOnlyChanModes()): return_value != null
    //#unanalyzed(String getSetOnlyChanModes()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(String getSetOnlyChanModes()): Effects-of-calling:java.util.Map:size
    //#unanalyzed(String getSetOnlyChanModes()): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(String getSetOnlyChanModes()): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(String getSetOnlyChanModes()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(String getSetOnlyChanModes()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(String getSetOnlyChanModes()): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(String getSetOnlyChanModes()): Effects-of-calling:java.util.Arrays:sort
    //#unanalyzed(String getSetOnlyChanModes()): Effects-of-calling:java.lang.String
    //#unanalyzed(String getSetOnlyChanModes()): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(String getSetOnlyChanModes()): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(String getSetOnlyChanModes()): Effects-of-calling:java.lang.String:trim
    //#IRCParser.java:1246: end of method: String com.dmdirc.parser.irc.IRCParser.getSetOnlyChanModes()
	}

	/**
	 * Get the known Set-Unset chanmodes.
	 * Modes are returned in alphabetical order
	 *
	 * @return All the currently known Set-Unset modes
	 */
	public String getSetUnsetChanModes() {
		return getOtherModeString((byte) (MODE_SET + MODE_UNSET));
    //#IRCParser.java:1256: method: String com.dmdirc.parser.irc.IRCParser.getSetUnsetChanModes()
    //#input(String getSetUnsetChanModes()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(String getSetUnsetChanModes()): __Descendant_Table[others]
    //#input(String getSetUnsetChanModes()): __Dispatch_Table.getOtherModeString(B)Ljava/lang/String;
    //#input(String getSetUnsetChanModes()): this
    //#input(String getSetUnsetChanModes()): this.__Tag
    //#input(String getSetUnsetChanModes()): this.hChanModesOther
    //#output(String getSetUnsetChanModes()): return_value
    //#pre[2] (String getSetUnsetChanModes()): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[3] (String getSetUnsetChanModes()): this.hChanModesOther != null
    //#post(String getSetUnsetChanModes()): return_value != null
    //#unanalyzed(String getSetUnsetChanModes()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(String getSetUnsetChanModes()): Effects-of-calling:java.util.Map:size
    //#unanalyzed(String getSetUnsetChanModes()): Effects-of-calling:java.util.Map:keySet
    //#unanalyzed(String getSetUnsetChanModes()): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(String getSetUnsetChanModes()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(String getSetUnsetChanModes()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(String getSetUnsetChanModes()): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(String getSetUnsetChanModes()): Effects-of-calling:java.util.Arrays:sort
    //#unanalyzed(String getSetUnsetChanModes()): Effects-of-calling:java.lang.String
    //#unanalyzed(String getSetUnsetChanModes()): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(String getSetUnsetChanModes()): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(String getSetUnsetChanModes()): Effects-of-calling:java.lang.String:trim
    //#IRCParser.java:1256: end of method: String com.dmdirc.parser.irc.IRCParser.getSetUnsetChanModes()
	}

	/**
	 * Get modes from hChanModesOther that have a specific value.
	 * Modes are returned in alphabetical order
	 *
	 * @param nValue Value mode must have to be included
	 * @return All the currently known Set-Unset modes
	 */
	protected String getOtherModeString(final byte nValue) {
		final char[] modes = new char[hChanModesOther.size()];
    //#IRCParser.java:1267: method: String com.dmdirc.parser.irc.IRCParser.getOtherModeString(byte)
    //#input(String getOtherModeString(byte)): nValue
    //#input(String getOtherModeString(byte)): this
    //#input(String getOtherModeString(byte)): this.hChanModesOther
    //#output(String getOtherModeString(byte)): return_value
    //#pre[3] (String getOtherModeString(byte)): this.hChanModesOther != null
    //#presumption(String getOtherModeString(byte)): java.util.Iterator:next(...)@1270 != null
    //#presumption(String getOtherModeString(byte)): java.util.Map:get(...)@1271 != null
    //#presumption(String getOtherModeString(byte)): java.util.Map:keySet(...)@1270 != null
    //#presumption(String getOtherModeString(byte)): java.util.Map:size(...)@1267 >= 1
    //#post(String getOtherModeString(byte)): return_value != null
    //#test_vector(String getOtherModeString(byte)): java.util.Iterator:hasNext(...)@1270: {0}, {1}
		Byte nTemp;
		int i = 0;
		for (char cTemp : hChanModesOther.keySet()) {
			nTemp = hChanModesOther.get(cTemp);
			if (nTemp == nValue) { modes[i++] = cTemp; }
    //#IRCParser.java:1272: ?overflow
    //#    i in {-2_147_483_649..4_294_967_294}
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: String getOtherModeString(byte)
    //#    basic block: bb_4
    //#    assertion: i in {-2_147_483_649..4_294_967_294}
    //#    VN: i + 1
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
    //#IRCParser.java:1272: ?array index out of bounds
    //#    i < modes.length
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: String getOtherModeString(byte)
    //#    basic block: bb_4
    //#    assertion: i < modes.length
    //#    VN: -(i - java.util.Map:size(...)@1267)
    //#    Expected: {1..+Inf}
    //#    Bad: {-4_294_967_293..0}
    //#    Attribs:  Int  Bad overlaps +/-1000  Bad < Exp
		}
		// Alphabetically sort the array
		Arrays.sort(modes);
		return new String(modes).trim();
    //#IRCParser.java:1276: end of method: String com.dmdirc.parser.irc.IRCParser.getOtherModeString(byte)
	}

	/**
	 * Get the known usermodes.
	 * Modes are returned in the order specified by the ircd.
	 *
	 * @return All the currently known usermodes (returns "" if usermodes are unknown)
	 */
	public String getUserModeString() {
		if (h005Info.containsKey("USERMODES")) {
    //#IRCParser.java:1286: method: String com.dmdirc.parser.irc.IRCParser.getUserModeString()
    //#input(String getUserModeString()): this
    //#input(String getUserModeString()): this.h005Info
    //#output(String getUserModeString()): return_value
    //#pre[2] (String getUserModeString()): this.h005Info != null
    //#post(String getUserModeString()): init'ed(return_value)
    //#test_vector(String getUserModeString()): java.util.Map:containsKey(...)@1286: {0}, {1}
			return h005Info.get("USERMODES");
		} else {
			return "";
    //#IRCParser.java:1289: end of method: String com.dmdirc.parser.irc.IRCParser.getUserModeString()
		}
	}

	/**
	 * Process USERMODES from 004.
	 */
	protected void parseUserModes() {
		final String sDefaultModes = "nwdoi";
    //#IRCParser.java:1297: method: void com.dmdirc.parser.irc.IRCParser.parseUserModes()
    //#IRCParser.java:1297: Warning: unused assignment
    //#    Unused assignment into sDefaultModes
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseUserModes()
    //#input(void parseUserModes()): "Callback not found: "._tainted
    //#input(void parseUserModes()): "OnDebugInfo"._tainted
    //#input(void parseUserModes()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void parseUserModes()): __Descendant_Table[others]
    //#input(void parseUserModes()): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void parseUserModes()): __Dispatch_Table.callDebugInfo(ILjava/lang/String;[Ljava/lang/Object;)Z
    //#input(void parseUserModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void parseUserModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void parseUserModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void parseUserModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void parseUserModes()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void parseUserModes()): this
    //#input(void parseUserModes()): this.__Tag
    //#input(void parseUserModes()): this.h005Info
    //#input(void parseUserModes()): this.hUserModes
    //#input(void parseUserModes()): this.myCallbackManager
    //#input(void parseUserModes()): this.myCallbackManager.callbackHash
    //#output(void parseUserModes()): this.nNextKeyUser
    //#pre[3] (void parseUserModes()): this.h005Info != null
    //#pre[4] (void parseUserModes()): this.hUserModes != null
    //#pre[2] (void parseUserModes()): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[5] (void parseUserModes()): (soft) this.myCallbackManager != null
    //#pre[6] (void parseUserModes()): (soft) this.myCallbackManager.callbackHash != null
    //#presumption(void parseUserModes()): java.util.Map:get(...)@1300 != null
    //#post(void parseUserModes()): this.nNextKeyUser <= 18_446_744_073_709_551_614
    //#unanalyzed(void parseUserModes()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void parseUserModes()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void parseUserModes()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void parseUserModes()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void parseUserModes()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void parseUserModes()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void parseUserModes()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void parseUserModes()): Effects-of-calling:call
    //#unanalyzed(void parseUserModes()): Effects-of-calling:callDebugInfo
    //#unanalyzed(void parseUserModes()): Effects-of-calling:java.lang.String:format
    //#unanalyzed(void parseUserModes()): Effects-of-calling:java.lang.Integer:valueOf
    //#test_vector(void parseUserModes()): java.util.Map:containsKey(...)@1299: {0}, {1}
    //#test_vector(void parseUserModes()): java.util.Map:containsKey(...)@1314: {1}, {0}
		String modeStr;
		if (h005Info.containsKey("USERMODES")) {
			modeStr = h005Info.get("USERMODES");
		} else {
			modeStr = sDefaultModes;
			h005Info.put("USERMODES", sDefaultModes);
		}

		// resetState
		hUserModes.clear();
		nNextKeyUser = 1;

		// Boolean Mode
		for (int i = 0; i < modeStr.length(); ++i) {
			final Character cMode = modeStr.charAt(i);
			callDebugInfo(DEBUG_INFO, "Found User Mode: %c [%d]", cMode, nNextKeyUser);
			if (!hUserModes.containsKey(cMode)) {
				hUserModes.put(cMode, nNextKeyUser);
				nNextKeyUser = nNextKeyUser * 2;
    //#IRCParser.java:1316: ?overflow
    //#    this.nNextKeyUser*2 in {-9_223_372_036_854_775_808..18_446_744_073_709_551_615}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseUserModes()
    //#    basic block: bb_7
    //#    assertion: this.nNextKeyUser*2 in {-9_223_372_036_854_775_808..18_446_744_073_709_551_615}
    //#    VN: this.nNextKeyUser*2
    //#    Expected: {-9_223_372_036_854_775_808..18_446_744_073_709_551_615, Invalid}
    //#    Bad: {-18_446_744_073_709_551_616..-9_223_372_036_854_775_809, 18_446_744_073_709_551_616..36_893_488_147_419_103_228}
    //#    Attribs:  Int  Bad < Exp  Bad > Exp
			}
		}
	}
    //#IRCParser.java:1319: end of method: void com.dmdirc.parser.irc.IRCParser.parseUserModes()

	/**
	 * Process CHANTYPES from 005.
	 */
	protected void parseChanPrefix() {
		final String sDefaultModes = "#&";
    //#IRCParser.java:1325: method: void com.dmdirc.parser.irc.IRCParser.parseChanPrefix()
    //#IRCParser.java:1325: Warning: unused assignment
    //#    Unused assignment into sDefaultModes
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parseChanPrefix()
    //#input(void parseChanPrefix()): "Callback not found: "._tainted
    //#input(void parseChanPrefix()): "OnDebugInfo"._tainted
    //#input(void parseChanPrefix()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void parseChanPrefix()): __Descendant_Table[others]
    //#input(void parseChanPrefix()): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void parseChanPrefix()): __Dispatch_Table.callDebugInfo(ILjava/lang/String;[Ljava/lang/Object;)Z
    //#input(void parseChanPrefix()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void parseChanPrefix()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void parseChanPrefix()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void parseChanPrefix()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void parseChanPrefix()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void parseChanPrefix()): this
    //#input(void parseChanPrefix()): this.__Tag
    //#input(void parseChanPrefix()): this.h005Info
    //#input(void parseChanPrefix()): this.hChanPrefix
    //#input(void parseChanPrefix()): this.myCallbackManager
    //#input(void parseChanPrefix()): this.myCallbackManager.callbackHash
    //#pre[3] (void parseChanPrefix()): this.h005Info != null
    //#pre[4] (void parseChanPrefix()): this.hChanPrefix != null
    //#pre[2] (void parseChanPrefix()): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[5] (void parseChanPrefix()): (soft) this.myCallbackManager != null
    //#pre[6] (void parseChanPrefix()): (soft) this.myCallbackManager.callbackHash != null
    //#presumption(void parseChanPrefix()): java.util.Map:get(...)@1328 != null
    //#unanalyzed(void parseChanPrefix()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void parseChanPrefix()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void parseChanPrefix()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void parseChanPrefix()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void parseChanPrefix()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void parseChanPrefix()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void parseChanPrefix()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void parseChanPrefix()): Effects-of-calling:call
    //#unanalyzed(void parseChanPrefix()): Effects-of-calling:callDebugInfo
    //#unanalyzed(void parseChanPrefix()): Effects-of-calling:java.lang.String:format
    //#unanalyzed(void parseChanPrefix()): Effects-of-calling:java.lang.Integer:valueOf
    //#test_vector(void parseChanPrefix()): java.util.Map:containsKey(...)@1327: {0}, {1}
    //#test_vector(void parseChanPrefix()): java.util.Map:containsKey(...)@1341: {1}, {0}
		String modeStr;
		if (h005Info.containsKey("CHANTYPES")) {
			modeStr = h005Info.get("CHANTYPES");
		} else {
			modeStr = sDefaultModes;
			h005Info.put("CHANTYPES", sDefaultModes);
		}

		// resetState
		hChanPrefix.clear();

		// Boolean Mode
		for (int i = 0; i < modeStr.length(); ++i) {
			final Character cMode = modeStr.charAt(i);
			callDebugInfo(DEBUG_INFO, "Found Chan Prefix: %c", cMode);
			if (!hChanPrefix.containsKey(cMode)) { hChanPrefix.put(cMode, true); }
		}
	}
    //#IRCParser.java:1343: end of method: void com.dmdirc.parser.irc.IRCParser.parseChanPrefix()

	/**
	 * Process PREFIX from 005.
	 */
	public void parsePrefixModes() {
		final String sDefaultModes = "(ohv)@%+";
    //#IRCParser.java:1349: method: void com.dmdirc.parser.irc.IRCParser.parsePrefixModes()
    //#IRCParser.java:1349: Warning: unused assignment
    //#    Unused assignment into sDefaultModes
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#input(void parsePrefixModes()): """._tainted
    //#input(void parsePrefixModes()): "(ohv)@%+"._tainted
    //#input(void parsePrefixModes()): "Callback not found: "._tainted
    //#input(void parsePrefixModes()): "OnDebugInfo"._tainted
    //#input(void parsePrefixModes()): "OnErrorInfo"._tainted
    //#input(void parsePrefixModes()): "PREFIX String not valid. Using default string of ""._tainted
    //#input(void parsePrefixModes()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void parsePrefixModes()): __Descendant_Table[others]
    //#input(void parsePrefixModes()): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void parsePrefixModes()): __Dispatch_Table.callDebugInfo(ILjava/lang/String;[Ljava/lang/Object;)Z
    //#input(void parsePrefixModes()): __Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#input(void parsePrefixModes()): __Dispatch_Table.getLastLine()Ljava/lang/String;
    //#input(void parsePrefixModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void parsePrefixModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void parsePrefixModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void parsePrefixModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void parsePrefixModes()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void parsePrefixModes()): this
    //#input(void parsePrefixModes()): this.__Tag
    //#input(void parsePrefixModes()): this.h005Info
    //#input(void parsePrefixModes()): this.hPrefixMap
    //#input(void parsePrefixModes()): this.hPrefixModes
    //#input(void parsePrefixModes()): this.lastLine
    //#input(void parsePrefixModes()): this.myCallbackManager
    //#input(void parsePrefixModes()): this.myCallbackManager.callbackHash
    //#output(void parsePrefixModes()): this.nNextKeyPrefix
    //#pre[2] (void parsePrefixModes()): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[3] (void parsePrefixModes()): this.h005Info != null
    //#pre[4] (void parsePrefixModes()): this.hPrefixMap != null
    //#pre[5] (void parsePrefixModes()): this.hPrefixModes != null
    //#pre[6] (void parsePrefixModes()): init'ed(this.lastLine)
    //#pre[7] (void parsePrefixModes()): this.myCallbackManager != null
    //#pre[8] (void parsePrefixModes()): this.myCallbackManager.callbackHash != null
    //#presumption(void parsePrefixModes()): java.util.Map:get(...)@1353 != null
    //#post(void parsePrefixModes()): this.nNextKeyPrefix <= 18_446_744_073_709_551_614
    //#unanalyzed(void parsePrefixModes()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void parsePrefixModes()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void parsePrefixModes()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void parsePrefixModes()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void parsePrefixModes()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void parsePrefixModes()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void parsePrefixModes()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void parsePrefixModes()): Effects-of-calling:call
    //#unanalyzed(void parsePrefixModes()): Effects-of-calling:callDebugInfo
    //#unanalyzed(void parsePrefixModes()): Effects-of-calling:java.lang.String:format
    //#unanalyzed(void parsePrefixModes()): Effects-of-calling:java.lang.Integer:valueOf
    //#test_vector(void parsePrefixModes()): java.lang.String:equals(...)@1357: {0}, {1}
    //#test_vector(void parsePrefixModes()): java.util.Map:containsKey(...)@1352: {0}, {1}
    //#test_vector(void parsePrefixModes()): java.util.Map:containsKey(...)@1382: {1}, {0}
		String[] bits;
		String modeStr;
		if (h005Info.containsKey("PREFIX")) {
			modeStr = h005Info.get("PREFIX");
		} else {
			modeStr = sDefaultModes;
		}
		if (modeStr.substring(0, 1).equals("(")) {
			modeStr = modeStr.substring(1);
		} else {
			modeStr = sDefaultModes.substring(1);
			h005Info.put("PREFIX", sDefaultModes);
		}

		bits = modeStr.split("\\)", 2);
		if (bits.length != 2 || bits[0].length() != bits[1].length()) {
    //#IRCParser.java:1365: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_7
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1365: Warning: test always goes same way
    //#    Test predetermined because bits.length == 0
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    from bb: bb_7
    //#    live edge: bb_7-->bb_9
    //#    tested vn: undefined - 2
    //#    tested vn values: {-2}
    //#IRCParser.java:1365: Warning: dead code
    //#    Dead code here because bits.length == 0
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    dead bb: bb_8
			modeStr = sDefaultModes;
			callErrorInfo(new ParserError(ParserError.ERROR_ERROR, "PREFIX String not valid. Using default string of \"" + modeStr + "\"", getLastLine()));
			h005Info.put("PREFIX", modeStr);
			modeStr = modeStr.substring(1);
			bits = modeStr.split("\\)", 2);
		}

		// resetState
		hPrefixModes.clear();
		hPrefixMap.clear();
		nNextKeyPrefix = 1;

		for (int i = bits[0].length() - 1; i > -1; --i) {
    //#IRCParser.java:1378: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_10
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1378: ?use of default init
    //#    init'ed(bits[0])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_10
    //#    assertion: init'ed(bits[0])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:1378: ?null dereference
    //#    not_init'ed(bits[0])
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_10
    //#    assertion: not_init'ed(bits[0])
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
			final Character cMode = bits[0].charAt(i);
    //#IRCParser.java:1379: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_12
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1379: ?use of default init
    //#    init'ed(bits[0])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_12
    //#    assertion: init'ed(bits[0])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:1379: ?null dereference
    //#    not_init'ed(bits[0])
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_12
    //#    assertion: not_init'ed(bits[0])
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
			final Character cPrefix = bits[1].charAt(i);
    //#IRCParser.java:1380: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_12
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1380: ?!array index out of bounds
    //#    bits.length >= 2
    //#    severity: HIGH
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_12
    //#    assertion: bits.length >= 2
    //#    VN: undefined - 1
    //#    Expected: {1..+Inf}
    //#    Bad: {-1}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
    //#IRCParser.java:1380: ?use of default init
    //#    init'ed(bits[1])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_12
    //#    assertion: init'ed(bits[1])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#IRCParser.java:1380: ?null dereference
    //#    not_init'ed(bits[1])
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_12
    //#    assertion: not_init'ed(bits[1])
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
			callDebugInfo(DEBUG_INFO, "Found Prefix Mode: %c => %c [%d]", cMode, cPrefix, nNextKeyPrefix);
			if (!hPrefixModes.containsKey(cMode)) {
				hPrefixModes.put(cMode, nNextKeyPrefix);
    //#IRCParser.java:1383: ?use of default init
    //#    init'ed(this.nNextKeyPrefix)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_13
    //#    assertion: init'ed(this.nNextKeyPrefix)
    //#    VN: this.nNextKeyPrefix
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
				hPrefixMap.put(cMode, cPrefix);
				hPrefixMap.put(cPrefix, cMode);
				nNextKeyPrefix = nNextKeyPrefix * 2;
    //#IRCParser.java:1386: ?overflow
    //#    this.nNextKeyPrefix*2 in {-9_223_372_036_854_775_808..18_446_744_073_709_551_615}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_13
    //#    assertion: this.nNextKeyPrefix*2 in {-9_223_372_036_854_775_808..18_446_744_073_709_551_615}
    //#    VN: this.nNextKeyPrefix*2
    //#    Expected: {-9_223_372_036_854_775_808..18_446_744_073_709_551_615, Invalid}
    //#    Bad: {-18_446_744_073_709_551_616..-9_223_372_036_854_775_809, 18_446_744_073_709_551_616..36_893_488_147_419_103_230}
    //#    Attribs:  Int  Bad < Exp  Bad > Exp
			}
		}

		h005Info.put("PREFIXSTRING", bits[0]);
    //#IRCParser.java:1390: ?use of default init
    //#    init'ed(bits.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_15
    //#    assertion: init'ed(bits.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1390: ?use of default init
    //#    init'ed(bits[0])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void parsePrefixModes()
    //#    basic block: bb_15
    //#    assertion: init'ed(bits[0])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
	}
    //#IRCParser.java:1391: end of method: void com.dmdirc.parser.irc.IRCParser.parsePrefixModes()

	/**
	 * Check if server is ready.
	 *
	 * @return true if 001 has been recieved, false otherwise.
	 */
	public boolean isReady() { return got001; }
    //#IRCParser.java:1398: method: bool com.dmdirc.parser.irc.IRCParser.isReady()
    //#input(bool isReady()): this
    //#input(bool isReady()): this.got001
    //#output(bool isReady()): return_value
    //#pre[2] (bool isReady()): init'ed(this.got001)
    //#post(bool isReady()): return_value == this.got001
    //#post(bool isReady()): init'ed(return_value)
    //#IRCParser.java:1398: end of method: bool com.dmdirc.parser.irc.IRCParser.isReady()

	/**
	 * Join a Channel.
	 *
	 * @param sChannelName Name of channel to join
	 */
	public void joinChannel(final String sChannelName) {
		joinChannel(sChannelName, "", true);
    //#IRCParser.java:1406: method: void com.dmdirc.parser.irc.IRCParser.joinChannel(String)
    //#input(void joinChannel(String)): " "._tainted
    //#input(void joinChannel(String)): " for mode "._tainted
    //#input(void joinChannel(String)): ""._tainted
    //#input(void joinChannel(String)): "#"._tainted
    //#input(void joinChannel(String)): "Callback not found: "._tainted
    //#input(void joinChannel(String)): "Intercepted mode request for "._tainted
    //#input(void joinChannel(String)): "JOIN "._tainted
    //#input(void joinChannel(String)): "OnDataOut"._tainted
    //#input(void joinChannel(String)): "OnDebugInfo"._tainted
    //#input(void joinChannel(String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void joinChannel(String)): __Descendant_Table[others]
    //#input(void joinChannel(String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void joinChannel(String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void joinChannel(String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void joinChannel(String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void joinChannel(String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void joinChannel(String)): __Dispatch_Table.getMyNickname()Ljava/lang/String;
    //#input(void joinChannel(String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void joinChannel(String)): __Dispatch_Table.isValidChannelName(Ljava/lang/String;)Z
    //#input(void joinChannel(String)): __Dispatch_Table.joinChannel(Ljava/lang/String;Ljava/lang/String;Z)V
    //#input(void joinChannel(String)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void joinChannel(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void joinChannel(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void joinChannel(String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void joinChannel(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void joinChannel(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void joinChannel(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.equalsIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void joinChannel(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void joinChannel(String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void joinChannel(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void joinChannel(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void joinChannel(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void joinChannel(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void joinChannel(String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void joinChannel(String)): sChannelName
    //#input(void joinChannel(String)): sChannelName._tainted
    //#input(void joinChannel(String)): this
    //#input(void joinChannel(String)): this.__Tag
    //#input(void joinChannel(String)): this.cMyself
    //#input(void joinChannel(String)): this.cMyself.bIsFake
    //#input(void joinChannel(String)): this.cMyself.sNickname
    //#input(void joinChannel(String)): this.currentSocketState
    //#input(void joinChannel(String)): this.h005Info
    //#input(void joinChannel(String)): this.hChanModesOther
    //#input(void joinChannel(String)): this.hChanPrefix
    //#input(void joinChannel(String)): this.hChannelList
    //#input(void joinChannel(String)): this.myCallbackManager
    //#input(void joinChannel(String)): this.myCallbackManager.callbackHash
    //#input(void joinChannel(String)): this.out
    //#input(void joinChannel(String)): this.sThinkNickname
    //#input(void joinChannel(String)): this.stringConverter
    //#input(void joinChannel(String)): this.stringConverter.__Tag
    //#input(void joinChannel(String)): this.stringConverter.lowercase
    //#input(void joinChannel(String)): this.stringConverter.lowercase.length
    //#output(void joinChannel(String)): java.lang.String:substring(...)._tainted
    //#output(void joinChannel(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void joinChannel(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void joinChannel(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void joinChannel(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void joinChannel(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void joinChannel(String)): new char[](IRCStringConverter#1) num objects
    //#output(void joinChannel(String)): new char[](IRCStringConverter#1).length
    //#output(void joinChannel(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void joinChannel(String)): new char[](IRCStringConverter#2) num objects
    //#output(void joinChannel(String)): new char[](IRCStringConverter#2).length
    //#output(void joinChannel(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void joinChannel(String)): this.cMyself.myAwayReason
    //#output(void joinChannel(String)): this.stringConverter
    //#new obj(void joinChannel(String)): java.lang.String:substring(...)
    //#new obj(void joinChannel(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void joinChannel(String)): new char[](IRCStringConverter#1)
    //#new obj(void joinChannel(String)): new char[](IRCStringConverter#2)
    //#pre[6] (void joinChannel(String)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[2] (void joinChannel(String)): (soft) init'ed(this.stringConverter)
    //#pre[7] (void joinChannel(String)): (soft) this.cMyself != null
    //#pre[8] (void joinChannel(String)): (soft) init'ed(this.cMyself.bIsFake)
    //#pre[9] (void joinChannel(String)): (soft) init'ed(this.cMyself.sNickname)
    //#pre[10] (void joinChannel(String)): (soft) init'ed(this.currentSocketState)
    //#pre[11] (void joinChannel(String)): (soft) this.h005Info != null
    //#pre[12] (void joinChannel(String)): (soft) this.hChanModesOther != null
    //#pre[13] (void joinChannel(String)): (soft) this.hChanPrefix != null
    //#pre[14] (void joinChannel(String)): (soft) this.hChannelList != null
    //#pre[16] (void joinChannel(String)): (soft) this.myCallbackManager != null
    //#pre[17] (void joinChannel(String)): (soft) this.myCallbackManager.callbackHash != null
    //#pre[18] (void joinChannel(String)): (soft) init'ed(this.out)
    //#pre[19] (void joinChannel(String)): (soft) init'ed(this.sThinkNickname)
    //#post(void joinChannel(String)): possibly_updated(java.lang.String:substring(...)._tainted)
    //#post(void joinChannel(String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void joinChannel(String)): init'ed(this.stringConverter)
    //#post(void joinChannel(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void joinChannel(String)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void joinChannel(String)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void joinChannel(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void joinChannel(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void joinChannel(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void joinChannel(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void joinChannel(String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void joinChannel(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void joinChannel(String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void joinChannel(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:isFake
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:getNickname
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:doSendString
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:call
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.util.Map:isEmpty
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void joinChannel(String)): Effects-of-calling:java.lang.System:currentTimeMillis
	}
    //#IRCParser.java:1407: end of method: void com.dmdirc.parser.irc.IRCParser.joinChannel(String)

	/**
	 * Join a Channel.
	 *
	 * @param sChannelName Name of channel to join
	 * @param autoPrefix Automatically prepend the first channel prefix defined
	 *                   in 005 if sChannelName is an invalid channel.
	 *                   **This only applies to the first channel if given a list**
	 */
	public void joinChannel(final String sChannelName, final boolean autoPrefix) {
		joinChannel(sChannelName, "", autoPrefix);
    //#IRCParser.java:1418: method: void com.dmdirc.parser.irc.IRCParser.joinChannel(String, bool)
    //#input(void joinChannel(String, bool)): " "._tainted
    //#input(void joinChannel(String, bool)): " for mode "._tainted
    //#input(void joinChannel(String, bool)): ""._tainted
    //#input(void joinChannel(String, bool)): "#"._tainted
    //#input(void joinChannel(String, bool)): "Callback not found: "._tainted
    //#input(void joinChannel(String, bool)): "Intercepted mode request for "._tainted
    //#input(void joinChannel(String, bool)): "JOIN "._tainted
    //#input(void joinChannel(String, bool)): "OnDataOut"._tainted
    //#input(void joinChannel(String, bool)): "OnDebugInfo"._tainted
    //#input(void joinChannel(String, bool)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void joinChannel(String, bool)): __Descendant_Table[others]
    //#input(void joinChannel(String, bool)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void joinChannel(String, bool)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void joinChannel(String, bool)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void joinChannel(String, bool)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void joinChannel(String, bool)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void joinChannel(String, bool)): __Dispatch_Table.getMyNickname()Ljava/lang/String;
    //#input(void joinChannel(String, bool)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void joinChannel(String, bool)): __Dispatch_Table.isValidChannelName(Ljava/lang/String;)Z
    //#input(void joinChannel(String, bool)): __Dispatch_Table.joinChannel(Ljava/lang/String;Ljava/lang/String;Z)V
    //#input(void joinChannel(String, bool)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void joinChannel(String, bool)): autoPrefix
    //#input(void joinChannel(String, bool)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void joinChannel(String, bool)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void joinChannel(String, bool)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void joinChannel(String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void joinChannel(String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void joinChannel(String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.equalsIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void joinChannel(String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void joinChannel(String, bool)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void joinChannel(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void joinChannel(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void joinChannel(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void joinChannel(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void joinChannel(String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void joinChannel(String, bool)): sChannelName
    //#input(void joinChannel(String, bool)): sChannelName._tainted
    //#input(void joinChannel(String, bool)): this
    //#input(void joinChannel(String, bool)): this.__Tag
    //#input(void joinChannel(String, bool)): this.cMyself
    //#input(void joinChannel(String, bool)): this.cMyself.bIsFake
    //#input(void joinChannel(String, bool)): this.cMyself.sNickname
    //#input(void joinChannel(String, bool)): this.currentSocketState
    //#input(void joinChannel(String, bool)): this.h005Info
    //#input(void joinChannel(String, bool)): this.hChanModesOther
    //#input(void joinChannel(String, bool)): this.hChanPrefix
    //#input(void joinChannel(String, bool)): this.hChannelList
    //#input(void joinChannel(String, bool)): this.myCallbackManager
    //#input(void joinChannel(String, bool)): this.myCallbackManager.callbackHash
    //#input(void joinChannel(String, bool)): this.out
    //#input(void joinChannel(String, bool)): this.sThinkNickname
    //#input(void joinChannel(String, bool)): this.stringConverter
    //#input(void joinChannel(String, bool)): this.stringConverter.__Tag
    //#input(void joinChannel(String, bool)): this.stringConverter.lowercase
    //#input(void joinChannel(String, bool)): this.stringConverter.lowercase.length
    //#output(void joinChannel(String, bool)): java.lang.String:substring(...)._tainted
    //#output(void joinChannel(String, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void joinChannel(String, bool)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void joinChannel(String, bool)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void joinChannel(String, bool)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void joinChannel(String, bool)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void joinChannel(String, bool)): new char[](IRCStringConverter#1) num objects
    //#output(void joinChannel(String, bool)): new char[](IRCStringConverter#1).length
    //#output(void joinChannel(String, bool)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void joinChannel(String, bool)): new char[](IRCStringConverter#2) num objects
    //#output(void joinChannel(String, bool)): new char[](IRCStringConverter#2).length
    //#output(void joinChannel(String, bool)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void joinChannel(String, bool)): this.cMyself.myAwayReason
    //#output(void joinChannel(String, bool)): this.stringConverter
    //#new obj(void joinChannel(String, bool)): java.lang.String:substring(...)
    //#new obj(void joinChannel(String, bool)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void joinChannel(String, bool)): new char[](IRCStringConverter#1)
    //#new obj(void joinChannel(String, bool)): new char[](IRCStringConverter#2)
    //#pre[7] (void joinChannel(String, bool)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[3] (void joinChannel(String, bool)): (soft) init'ed(this.stringConverter)
    //#pre[8] (void joinChannel(String, bool)): (soft) this.cMyself != null
    //#pre[9] (void joinChannel(String, bool)): (soft) init'ed(this.cMyself.bIsFake)
    //#pre[10] (void joinChannel(String, bool)): (soft) init'ed(this.cMyself.sNickname)
    //#pre[11] (void joinChannel(String, bool)): (soft) init'ed(this.currentSocketState)
    //#pre[12] (void joinChannel(String, bool)): (soft) this.h005Info != null
    //#pre[13] (void joinChannel(String, bool)): (soft) this.hChanModesOther != null
    //#pre[14] (void joinChannel(String, bool)): (soft) this.hChanPrefix != null
    //#pre[15] (void joinChannel(String, bool)): (soft) this.hChannelList != null
    //#pre[17] (void joinChannel(String, bool)): (soft) this.myCallbackManager != null
    //#pre[18] (void joinChannel(String, bool)): (soft) this.myCallbackManager.callbackHash != null
    //#pre[19] (void joinChannel(String, bool)): (soft) init'ed(this.out)
    //#pre[20] (void joinChannel(String, bool)): (soft) init'ed(this.sThinkNickname)
    //#post(void joinChannel(String, bool)): possibly_updated(java.lang.String:substring(...)._tainted)
    //#post(void joinChannel(String, bool)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void joinChannel(String, bool)): init'ed(this.stringConverter)
    //#post(void joinChannel(String, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void joinChannel(String, bool)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void joinChannel(String, bool)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void joinChannel(String, bool)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void joinChannel(String, bool)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void joinChannel(String, bool)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void joinChannel(String, bool)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void joinChannel(String, bool)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void joinChannel(String, bool)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void joinChannel(String, bool)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void joinChannel(String, bool)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:isFake
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:getNickname
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:doSendString
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.String
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:call
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.util.Map:isEmpty
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:setAwayReason
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void joinChannel(String, bool)): Effects-of-calling:java.lang.System:currentTimeMillis
	}
    //#IRCParser.java:1419: end of method: void com.dmdirc.parser.irc.IRCParser.joinChannel(String, bool)

	/**
	 * Join a Channel with a key.
	 *
	 * @param sChannelName Name of channel to join
	 * @param sKey Key to use to try and join the channel
	 */
	public void joinChannel(final String sChannelName, final String sKey) {
		joinChannel(sChannelName, sKey, true);
    //#IRCParser.java:1428: method: void com.dmdirc.parser.irc.IRCParser.joinChannel(String, String)
    //#input(void joinChannel(String, String)): " "._tainted
    //#input(void joinChannel(String, String)): " for mode "._tainted
    //#input(void joinChannel(String, String)): "#"._tainted
    //#input(void joinChannel(String, String)): "Callback not found: "._tainted
    //#input(void joinChannel(String, String)): "Intercepted mode request for "._tainted
    //#input(void joinChannel(String, String)): "JOIN "._tainted
    //#input(void joinChannel(String, String)): "OnDataOut"._tainted
    //#input(void joinChannel(String, String)): "OnDebugInfo"._tainted
    //#input(void joinChannel(String, String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void joinChannel(String, String)): __Descendant_Table[others]
    //#input(void joinChannel(String, String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void joinChannel(String, String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void joinChannel(String, String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void joinChannel(String, String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void joinChannel(String, String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void joinChannel(String, String)): __Dispatch_Table.getMyNickname()Ljava/lang/String;
    //#input(void joinChannel(String, String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void joinChannel(String, String)): __Dispatch_Table.isValidChannelName(Ljava/lang/String;)Z
    //#input(void joinChannel(String, String)): __Dispatch_Table.joinChannel(Ljava/lang/String;Ljava/lang/String;Z)V
    //#input(void joinChannel(String, String)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void joinChannel(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void joinChannel(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void joinChannel(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void joinChannel(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void joinChannel(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void joinChannel(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.equalsIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void joinChannel(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void joinChannel(String, String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void joinChannel(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void joinChannel(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void joinChannel(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void joinChannel(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void joinChannel(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void joinChannel(String, String)): sChannelName
    //#input(void joinChannel(String, String)): sChannelName._tainted
    //#input(void joinChannel(String, String)): sKey
    //#input(void joinChannel(String, String)): sKey._tainted
    //#input(void joinChannel(String, String)): this
    //#input(void joinChannel(String, String)): this.__Tag
    //#input(void joinChannel(String, String)): this.cMyself
    //#input(void joinChannel(String, String)): this.cMyself.bIsFake
    //#input(void joinChannel(String, String)): this.cMyself.sNickname
    //#input(void joinChannel(String, String)): this.currentSocketState
    //#input(void joinChannel(String, String)): this.h005Info
    //#input(void joinChannel(String, String)): this.hChanModesOther
    //#input(void joinChannel(String, String)): this.hChanPrefix
    //#input(void joinChannel(String, String)): this.hChannelList
    //#input(void joinChannel(String, String)): this.myCallbackManager
    //#input(void joinChannel(String, String)): this.myCallbackManager.callbackHash
    //#input(void joinChannel(String, String)): this.out
    //#input(void joinChannel(String, String)): this.sThinkNickname
    //#input(void joinChannel(String, String)): this.stringConverter
    //#input(void joinChannel(String, String)): this.stringConverter.__Tag
    //#input(void joinChannel(String, String)): this.stringConverter.lowercase
    //#input(void joinChannel(String, String)): this.stringConverter.lowercase.length
    //#output(void joinChannel(String, String)): java.lang.String:substring(...)._tainted
    //#output(void joinChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void joinChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void joinChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void joinChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void joinChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void joinChannel(String, String)): new char[](IRCStringConverter#1) num objects
    //#output(void joinChannel(String, String)): new char[](IRCStringConverter#1).length
    //#output(void joinChannel(String, String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void joinChannel(String, String)): new char[](IRCStringConverter#2) num objects
    //#output(void joinChannel(String, String)): new char[](IRCStringConverter#2).length
    //#output(void joinChannel(String, String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void joinChannel(String, String)): this.cMyself.myAwayReason
    //#output(void joinChannel(String, String)): this.stringConverter
    //#new obj(void joinChannel(String, String)): java.lang.String:substring(...)
    //#new obj(void joinChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void joinChannel(String, String)): new char[](IRCStringConverter#1)
    //#new obj(void joinChannel(String, String)): new char[](IRCStringConverter#2)
    //#pre[2] (void joinChannel(String, String)): (soft) init'ed(this.stringConverter)
    //#pre[5] (void joinChannel(String, String)): (soft) sKey != null
    //#pre[8] (void joinChannel(String, String)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[9] (void joinChannel(String, String)): (soft) this.cMyself != null
    //#pre[10] (void joinChannel(String, String)): (soft) init'ed(this.cMyself.bIsFake)
    //#pre[11] (void joinChannel(String, String)): (soft) init'ed(this.cMyself.sNickname)
    //#pre[12] (void joinChannel(String, String)): (soft) init'ed(this.currentSocketState)
    //#pre[13] (void joinChannel(String, String)): (soft) this.h005Info != null
    //#pre[14] (void joinChannel(String, String)): (soft) this.hChanModesOther != null
    //#pre[15] (void joinChannel(String, String)): (soft) this.hChanPrefix != null
    //#pre[16] (void joinChannel(String, String)): (soft) this.hChannelList != null
    //#pre[18] (void joinChannel(String, String)): (soft) this.myCallbackManager != null
    //#pre[19] (void joinChannel(String, String)): (soft) this.myCallbackManager.callbackHash != null
    //#pre[20] (void joinChannel(String, String)): (soft) init'ed(this.out)
    //#pre[21] (void joinChannel(String, String)): (soft) init'ed(this.sThinkNickname)
    //#post(void joinChannel(String, String)): possibly_updated(java.lang.String:substring(...)._tainted)
    //#post(void joinChannel(String, String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void joinChannel(String, String)): init'ed(this.stringConverter)
    //#post(void joinChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void joinChannel(String, String)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void joinChannel(String, String)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void joinChannel(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void joinChannel(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void joinChannel(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void joinChannel(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void joinChannel(String, String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void joinChannel(String, String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void joinChannel(String, String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void joinChannel(String, String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:isFake
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:getNickname
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:doSendString
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:call
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.util.Map:isEmpty
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void joinChannel(String, String)): Effects-of-calling:java.lang.System:currentTimeMillis
	}
    //#IRCParser.java:1429: end of method: void com.dmdirc.parser.irc.IRCParser.joinChannel(String, String)

	/**
	 * Join a Channel with a key.
	 *
	 * @param sChannelName Name of channel to join
	 * @param sKey Key to use to try and join the channel
	 * @param autoPrefix Automatically prepend the first channel prefix defined
	 *                   in 005 if sChannelName is an invalid channel.
	 *                   **This only applies to the first channel if given a list**
	 */
	public void joinChannel(final String sChannelName, final String sKey, final boolean autoPrefix) {
		final String channelName;
		if (isValidChannelName(sChannelName)) {
    //#IRCParser.java:1442: method: void com.dmdirc.parser.irc.IRCParser.joinChannel(String, String, bool)
    //#input(void joinChannel(String, String, bool)): " "._tainted
    //#input(void joinChannel(String, String, bool)): " for mode "._tainted
    //#input(void joinChannel(String, String, bool)): "#"._tainted
    //#input(void joinChannel(String, String, bool)): "Callback not found: "._tainted
    //#input(void joinChannel(String, String, bool)): "Intercepted mode request for "._tainted
    //#input(void joinChannel(String, String, bool)): "JOIN "._tainted
    //#input(void joinChannel(String, String, bool)): "OnDataOut"._tainted
    //#input(void joinChannel(String, String, bool)): "OnDebugInfo"._tainted
    //#input(void joinChannel(String, String, bool)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void joinChannel(String, String, bool)): __Descendant_Table[others]
    //#input(void joinChannel(String, String, bool)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void joinChannel(String, String, bool)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void joinChannel(String, String, bool)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void joinChannel(String, String, bool)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void joinChannel(String, String, bool)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void joinChannel(String, String, bool)): __Dispatch_Table.getMyNickname()Ljava/lang/String;
    //#input(void joinChannel(String, String, bool)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void joinChannel(String, String, bool)): __Dispatch_Table.isValidChannelName(Ljava/lang/String;)Z
    //#input(void joinChannel(String, String, bool)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void joinChannel(String, String, bool)): autoPrefix
    //#input(void joinChannel(String, String, bool)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void joinChannel(String, String, bool)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void joinChannel(String, String, bool)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void joinChannel(String, String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void joinChannel(String, String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void joinChannel(String, String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.equalsIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void joinChannel(String, String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void joinChannel(String, String, bool)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void joinChannel(String, String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void joinChannel(String, String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void joinChannel(String, String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void joinChannel(String, String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void joinChannel(String, String, bool)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void joinChannel(String, String, bool)): sChannelName
    //#input(void joinChannel(String, String, bool)): sChannelName._tainted
    //#input(void joinChannel(String, String, bool)): sKey
    //#input(void joinChannel(String, String, bool)): sKey._tainted
    //#input(void joinChannel(String, String, bool)): this
    //#input(void joinChannel(String, String, bool)): this.__Tag
    //#input(void joinChannel(String, String, bool)): this.cMyself
    //#input(void joinChannel(String, String, bool)): this.cMyself.bIsFake
    //#input(void joinChannel(String, String, bool)): this.cMyself.sNickname
    //#input(void joinChannel(String, String, bool)): this.currentSocketState
    //#input(void joinChannel(String, String, bool)): this.h005Info
    //#input(void joinChannel(String, String, bool)): this.hChanModesOther
    //#input(void joinChannel(String, String, bool)): this.hChanPrefix
    //#input(void joinChannel(String, String, bool)): this.hChannelList
    //#input(void joinChannel(String, String, bool)): this.myCallbackManager
    //#input(void joinChannel(String, String, bool)): this.myCallbackManager.callbackHash
    //#input(void joinChannel(String, String, bool)): this.out
    //#input(void joinChannel(String, String, bool)): this.sThinkNickname
    //#input(void joinChannel(String, String, bool)): this.stringConverter
    //#input(void joinChannel(String, String, bool)): this.stringConverter.__Tag
    //#input(void joinChannel(String, String, bool)): this.stringConverter.lowercase
    //#input(void joinChannel(String, String, bool)): this.stringConverter.lowercase.length
    //#output(void joinChannel(String, String, bool)): java.lang.String:substring(...)._tainted
    //#output(void joinChannel(String, String, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void joinChannel(String, String, bool)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void joinChannel(String, String, bool)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void joinChannel(String, String, bool)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void joinChannel(String, String, bool)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void joinChannel(String, String, bool)): new char[](IRCStringConverter#1) num objects
    //#output(void joinChannel(String, String, bool)): new char[](IRCStringConverter#1).length
    //#output(void joinChannel(String, String, bool)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void joinChannel(String, String, bool)): new char[](IRCStringConverter#2) num objects
    //#output(void joinChannel(String, String, bool)): new char[](IRCStringConverter#2).length
    //#output(void joinChannel(String, String, bool)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void joinChannel(String, String, bool)): this.cMyself.myAwayReason
    //#output(void joinChannel(String, String, bool)): this.stringConverter
    //#new obj(void joinChannel(String, String, bool)): java.lang.String:substring(...)
    //#new obj(void joinChannel(String, String, bool)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void joinChannel(String, String, bool)): new char[](IRCStringConverter#1)
    //#new obj(void joinChannel(String, String, bool)): new char[](IRCStringConverter#2)
    //#pre[3] (void joinChannel(String, String, bool)): (soft) init'ed(this.stringConverter)
    //#pre[6] (void joinChannel(String, String, bool)): (soft) sKey != null
    //#pre[9] (void joinChannel(String, String, bool)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[10] (void joinChannel(String, String, bool)): (soft) this.cMyself != null
    //#pre[11] (void joinChannel(String, String, bool)): (soft) init'ed(this.cMyself.bIsFake)
    //#pre[12] (void joinChannel(String, String, bool)): (soft) init'ed(this.cMyself.sNickname)
    //#pre[13] (void joinChannel(String, String, bool)): (soft) init'ed(this.currentSocketState)
    //#pre[14] (void joinChannel(String, String, bool)): (soft) this.h005Info != null
    //#pre[15] (void joinChannel(String, String, bool)): (soft) this.hChanModesOther != null
    //#pre[16] (void joinChannel(String, String, bool)): (soft) this.hChanPrefix != null
    //#pre[17] (void joinChannel(String, String, bool)): (soft) this.hChannelList != null
    //#pre[19] (void joinChannel(String, String, bool)): (soft) this.myCallbackManager != null
    //#pre[20] (void joinChannel(String, String, bool)): (soft) this.myCallbackManager.callbackHash != null
    //#pre[21] (void joinChannel(String, String, bool)): (soft) init'ed(this.out)
    //#pre[22] (void joinChannel(String, String, bool)): (soft) init'ed(this.sThinkNickname)
    //#presumption(void joinChannel(String, String, bool)): java.util.Map:get(...)@1447 != null
    //#post(void joinChannel(String, String, bool)): possibly_updated(java.lang.String:substring(...)._tainted)
    //#post(void joinChannel(String, String, bool)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void joinChannel(String, String, bool)): init'ed(this.stringConverter)
    //#post(void joinChannel(String, String, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects == 0
    //#post(void joinChannel(String, String, bool)): new char[](IRCStringConverter#1) num objects == 0
    //#post(void joinChannel(String, String, bool)): new char[](IRCStringConverter#2) num objects == 0
    //#post(void joinChannel(String, String, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void joinChannel(String, String, bool)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void joinChannel(String, String, bool)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void joinChannel(String, String, bool)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void joinChannel(String, String, bool)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void joinChannel(String, String, bool)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void joinChannel(String, String, bool)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void joinChannel(String, String, bool)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void joinChannel(String, String, bool)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void joinChannel(String, String, bool)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void joinChannel(String, String, bool)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:isFake
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:getNickname
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:doSendString
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.String
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:call
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.util.Map:isEmpty
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:setAwayReason
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void joinChannel(String, String, bool)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#test_vector(void joinChannel(String, String, bool)): autoPrefix: {0}, {1}
    //#test_vector(void joinChannel(String, String, bool)): java.lang.String:isEmpty(...)@1448: {0}, {1}
    //#test_vector(void joinChannel(String, String, bool)): java.lang.String:isEmpty(...)@1460: {0}, {1}
    //#test_vector(void joinChannel(String, String, bool)): java.util.Map:containsKey(...)@1446: {0}, {1}
			channelName = sChannelName;
		} else {
			if (autoPrefix) {
				if (h005Info.containsKey("CHANTYPES")) {
					final String chantypes = h005Info.get("CHANTYPES");
					if (chantypes.isEmpty()) {
						channelName = "#" + sChannelName;
					} else {
						channelName = chantypes.charAt(0) + sChannelName;
					}
				} else {
					return;
				}
			} else {
				return;
			}
		}
		if (sKey.isEmpty()) {
			sendString("JOIN " + channelName);
		} else {
			sendString("JOIN " + channelName + " " + sKey);
		}
	}
    //#IRCParser.java:1465: end of method: void com.dmdirc.parser.irc.IRCParser.joinChannel(String, String, bool)

	/**
	 * Leave a Channel.
	 *
	 * @param sChannelName Name of channel to part
	 * @param sReason Reason for leaving (Nothing sent if sReason is "")
	 */
	public void partChannel(final String sChannelName, final String sReason) {
		if (getChannelInfo(sChannelName) == null) { return; }
    //#IRCParser.java:1474: method: void com.dmdirc.parser.irc.IRCParser.partChannel(String, String)
    //#IRCParser.java:1474: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCParser.getChannelInfo: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void partChannel(String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    callee: ChannelInfo com/dmdirc/parser/irc/IRCParser.getChannelInfo(String)
    //#    callee assertion: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    callee file: IRCParser.java
    //#    callee precondition index: [9]
    //#    callee srcpos: 894
    //#    VN: this.stringConverter.lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
    //#input(void partChannel(String, String)): " :"._tainted
    //#input(void partChannel(String, String)): " for mode "._tainted
    //#input(void partChannel(String, String)): "Callback not found: "._tainted
    //#input(void partChannel(String, String)): "Intercepted mode request for "._tainted
    //#input(void partChannel(String, String)): "OnDataOut"._tainted
    //#input(void partChannel(String, String)): "OnDebugInfo"._tainted
    //#input(void partChannel(String, String)): "PART "._tainted
    //#input(void partChannel(String, String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void partChannel(String, String)): __Descendant_Table[others]
    //#input(void partChannel(String, String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void partChannel(String, String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void partChannel(String, String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void partChannel(String, String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void partChannel(String, String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void partChannel(String, String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void partChannel(String, String)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void partChannel(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void partChannel(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void partChannel(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void partChannel(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void partChannel(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void partChannel(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void partChannel(String, String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void partChannel(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void partChannel(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void partChannel(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void partChannel(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void partChannel(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void partChannel(String, String)): sChannelName
    //#input(void partChannel(String, String)): sChannelName._tainted
    //#input(void partChannel(String, String)): sReason
    //#input(void partChannel(String, String)): sReason._tainted
    //#input(void partChannel(String, String)): this
    //#input(void partChannel(String, String)): this.__Tag
    //#input(void partChannel(String, String)): this.cMyself
    //#input(void partChannel(String, String)): this.currentSocketState
    //#input(void partChannel(String, String)): this.hChanModesOther
    //#input(void partChannel(String, String)): this.hChannelList
    //#input(void partChannel(String, String)): this.myCallbackManager
    //#input(void partChannel(String, String)): this.myCallbackManager.callbackHash
    //#input(void partChannel(String, String)): this.out
    //#input(void partChannel(String, String)): this.stringConverter
    //#input(void partChannel(String, String)): this.stringConverter.__Tag
    //#input(void partChannel(String, String)): this.stringConverter.lowercase
    //#input(void partChannel(String, String)): this.stringConverter.lowercase.length
    //#input(void partChannel(String, String)): this.stringConverter.lowercase[0..65_535]
    //#output(void partChannel(String, String)): java.lang.String:substring(...)._tainted
    //#output(void partChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void partChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void partChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void partChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void partChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void partChannel(String, String)): new char[](IRCStringConverter#1) num objects
    //#output(void partChannel(String, String)): new char[](IRCStringConverter#1).length
    //#output(void partChannel(String, String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void partChannel(String, String)): new char[](IRCStringConverter#2) num objects
    //#output(void partChannel(String, String)): new char[](IRCStringConverter#2).length
    //#output(void partChannel(String, String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void partChannel(String, String)): this.cMyself.myAwayReason
    //#output(void partChannel(String, String)): this.stringConverter
    //#new obj(void partChannel(String, String)): java.lang.String:substring(...)
    //#new obj(void partChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void partChannel(String, String)): new char[](IRCStringConverter#1)
    //#new obj(void partChannel(String, String)): new char[](IRCStringConverter#2)
    //#pre[2] (void partChannel(String, String)): init'ed(this.stringConverter)
    //#pre[3] (void partChannel(String, String)): sChannelName != null
    //#pre[9] (void partChannel(String, String)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[13] (void partChannel(String, String)): this.hChannelList != null
    //#pre[6] (void partChannel(String, String)): (soft) sReason != null
    //#pre[10] (void partChannel(String, String)): (soft) this.cMyself != null
    //#pre[11] (void partChannel(String, String)): (soft) init'ed(this.currentSocketState)
    //#pre[12] (void partChannel(String, String)): (soft) this.hChanModesOther != null
    //#pre[15] (void partChannel(String, String)): (soft) this.myCallbackManager != null
    //#pre[16] (void partChannel(String, String)): (soft) this.myCallbackManager.callbackHash != null
    //#pre[17] (void partChannel(String, String)): (soft) init'ed(this.out)
    //#pre[18] (void partChannel(String, String)): (soft) this.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[19] (void partChannel(String, String)): (soft) this.stringConverter.lowercase != null
    //#pre[21] (void partChannel(String, String)): (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#post(void partChannel(String, String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void partChannel(String, String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void partChannel(String, String)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void partChannel(String, String)): this.stringConverter != null
    //#post(void partChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void partChannel(String, String)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void partChannel(String, String)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void partChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects == 0
    //#post(void partChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void partChannel(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void partChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(void partChannel(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void partChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(void partChannel(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void partChannel(String, String)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(void partChannel(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void partChannel(String, String)): new char[](IRCStringConverter#1) num objects == 0
    //#post(void partChannel(String, String)): new char[](IRCStringConverter#1).length == 127
    //#post(void partChannel(String, String)): new char[](IRCStringConverter#2).length == 127
    //#post(void partChannel(String, String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void partChannel(String, String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void partChannel(String, String)): new char[](IRCStringConverter#2) num objects == 0
    //#post(void partChannel(String, String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void partChannel(String, String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:doSendString
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:call
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void partChannel(String, String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#test_vector(void partChannel(String, String)): java.lang.String:isEmpty(...)@1475: {0}, {1}
		if (sReason.isEmpty()) {
			sendString("PART " + sChannelName);
		} else {
			sendString("PART " + sChannelName + " :" + sReason);
		}
	}
    //#IRCParser.java:1480: end of method: void com.dmdirc.parser.irc.IRCParser.partChannel(String, String)

	/**
	 * Set Nickname.
	 *
	 * @param sNewNickName New nickname wanted.
	 */
	public void setNickname(final String sNewNickName) {
		if (getSocketState() == SocketState.OPEN) {
    //#IRCParser.java:1488: method: void com.dmdirc.parser.irc.IRCParser.setNickname(String)
    //#input(void setNickname(String)): " for mode "._tainted
    //#input(void setNickname(String)): "Callback not found: "._tainted
    //#input(void setNickname(String)): "Intercepted mode request for "._tainted
    //#input(void setNickname(String)): "NICK "._tainted
    //#input(void setNickname(String)): "OnDataOut"._tainted
    //#input(void setNickname(String)): "OnDebugInfo"._tainted
    //#input(void setNickname(String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void setNickname(String)): __Descendant_Table[others]
    //#input(void setNickname(String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void setNickname(String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void setNickname(String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void setNickname(String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void setNickname(String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void setNickname(String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void setNickname(String)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void setNickname(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void setNickname(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void setNickname(String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void setNickname(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void setNickname(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void setNickname(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void setNickname(String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void setNickname(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void setNickname(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void setNickname(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void setNickname(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void setNickname(String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void setNickname(String)): sNewNickName
    //#input(void setNickname(String)): sNewNickName._tainted
    //#input(void setNickname(String)): this
    //#input(void setNickname(String)): this.__Tag
    //#input(void setNickname(String)): this.cMyself
    //#input(void setNickname(String)): this.cMyself.bIsFake
    //#input(void setNickname(String)): this.cMyself.sNickname
    //#input(void setNickname(String)): this.currentSocketState
    //#input(void setNickname(String)): this.hChanModesOther
    //#input(void setNickname(String)): this.hChannelList
    //#input(void setNickname(String)): this.me
    //#input(void setNickname(String)): this.myCallbackManager
    //#input(void setNickname(String)): this.myCallbackManager.callbackHash
    //#input(void setNickname(String)): this.out
    //#input(void setNickname(String)): this.stringConverter
    //#input(void setNickname(String)): this.stringConverter.__Tag
    //#input(void setNickname(String)): this.stringConverter.lowercase
    //#input(void setNickname(String)): this.stringConverter.lowercase.length
    //#output(void setNickname(String)): java.lang.String:substring(...)._tainted
    //#output(void setNickname(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void setNickname(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void setNickname(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void setNickname(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void setNickname(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void setNickname(String)): new char[](IRCStringConverter#1) num objects
    //#output(void setNickname(String)): new char[](IRCStringConverter#1).length
    //#output(void setNickname(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void setNickname(String)): new char[](IRCStringConverter#2) num objects
    //#output(void setNickname(String)): new char[](IRCStringConverter#2).length
    //#output(void setNickname(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void setNickname(String)): this.cMyself.myAwayReason
    //#output(void setNickname(String)): this.me.nickname
    //#output(void setNickname(String)): this.sThinkNickname
    //#output(void setNickname(String)): this.stringConverter
    //#new obj(void setNickname(String)): java.lang.String:substring(...)
    //#new obj(void setNickname(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void setNickname(String)): new char[](IRCStringConverter#1)
    //#new obj(void setNickname(String)): new char[](IRCStringConverter#2)
    //#pre[8] (void setNickname(String)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[12] (void setNickname(String)): init'ed(this.currentSocketState)
    //#pre[4] (void setNickname(String)): (soft) init'ed(this.stringConverter)
    //#pre[9] (void setNickname(String)): (soft) this.cMyself != null
    //#pre[10] (void setNickname(String)): (soft) init'ed(this.cMyself.bIsFake)
    //#pre[11] (void setNickname(String)): (soft) this.cMyself.sNickname != null
    //#pre[13] (void setNickname(String)): (soft) this.hChanModesOther != null
    //#pre[14] (void setNickname(String)): (soft) this.hChannelList != null
    //#pre[16] (void setNickname(String)): (soft) this.me != null
    //#pre[17] (void setNickname(String)): (soft) this.myCallbackManager != null
    //#pre[18] (void setNickname(String)): (soft) this.myCallbackManager.callbackHash != null
    //#pre[19] (void setNickname(String)): (soft) init'ed(this.out)
    //#post(void setNickname(String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void setNickname(String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void setNickname(String)): this.me.nickname == One-of{old this.me.nickname, sNewNickName}
    //#post(void setNickname(String)): this.sThinkNickname == One-of{old this.sThinkNickname, sNewNickName}
    //#post(void setNickname(String)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void setNickname(String)): init'ed(this.stringConverter)
    //#post(void setNickname(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void setNickname(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void setNickname(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void setNickname(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void setNickname(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void setNickname(String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void setNickname(String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void setNickname(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void setNickname(String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void setNickname(String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void setNickname(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void setNickname(String)): Effects-of-calling:doSendString
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void setNickname(String)): Effects-of-calling:call
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void setNickname(String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void setNickname(String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void setNickname(String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#test_vector(void setNickname(String)): this.cMyself.bIsFake: {1}, {0}
    //#test_vector(void setNickname(String)): java.lang.String:equals(...)@1489: {0}, {1}
			if (!cMyself.isFake() && cMyself.getNickname().equals(sNewNickName)) {
				return;
			}
			sendString("NICK " + sNewNickName);
		} else {
			me.setNickname(sNewNickName);
		}
		sThinkNickname = sNewNickName;
	}
    //#IRCParser.java:1497: end of method: void com.dmdirc.parser.irc.IRCParser.setNickname(String)

	/**
	 * Get the max length a message can be.
	 *
	 * @param sType Type of message (ie PRIVMSG)
	 * @param sTarget Target for message (eg #DMDirc)
	 * @return Max Length message should be.
	 */
	public int getMaxLength(final String sType, final String sTarget) {
		// If my host is "nick!user@host" and we are sending "#Channel"
		// a "PRIVMSG" this will find the length of ":nick!user@host PRIVMSG #channel :"
		// and subtract it from the MAX_LINELENGTH. This should be sufficient in most cases.
		// Lint = the 2 ":" at the start and end and the 3 separating " "s
		int length = 0;
    //#IRCParser.java:1511: method: int com.dmdirc.parser.irc.IRCParser.getMaxLength(String, String)
    //#input(int getMaxLength(String, String)): "!"._tainted
    //#input(int getMaxLength(String, String)): "@"._tainted
    //#input(int getMaxLength(String, String)): "Callback not found: "._tainted
    //#input(int getMaxLength(String, String)): "OnErrorInfo"._tainted
    //#input(int getMaxLength(String, String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(int getMaxLength(String, String)): __Descendant_Table[others]
    //#input(int getMaxLength(String, String)): __Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#input(int getMaxLength(String, String)): __Dispatch_Table.getLastLine()Ljava/lang/String;
    //#input(int getMaxLength(String, String)): __Dispatch_Table.getMaxLength(I)I
    //#input(int getMaxLength(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(int getMaxLength(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(int getMaxLength(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(int getMaxLength(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(int getMaxLength(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(int getMaxLength(String, String)): sTarget
    //#input(int getMaxLength(String, String)): sType
    //#input(int getMaxLength(String, String)): this
    //#input(int getMaxLength(String, String)): this.__Tag
    //#input(int getMaxLength(String, String)): this.cMyself
    //#input(int getMaxLength(String, String)): this.cMyself.bIsFake
    //#input(int getMaxLength(String, String)): this.cMyself.sHost
    //#input(int getMaxLength(String, String)): this.cMyself.sHost._tainted
    //#input(int getMaxLength(String, String)): this.cMyself.sIdent
    //#input(int getMaxLength(String, String)): this.cMyself.sIdent._tainted
    //#input(int getMaxLength(String, String)): this.cMyself.sNickname
    //#input(int getMaxLength(String, String)): this.cMyself.sNickname._tainted
    //#input(int getMaxLength(String, String)): this.lastLine
    //#input(int getMaxLength(String, String)): this.myCallbackManager
    //#input(int getMaxLength(String, String)): this.myCallbackManager.callbackHash
    //#output(int getMaxLength(String, String)): return_value
    //#pre[4] (int getMaxLength(String, String)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[5] (int getMaxLength(String, String)): this.cMyself != null
    //#pre[6] (int getMaxLength(String, String)): init'ed(this.cMyself.bIsFake)
    //#pre[7] (int getMaxLength(String, String)): (soft) init'ed(this.cMyself.sHost)
    //#pre[9] (int getMaxLength(String, String)): (soft) init'ed(this.cMyself.sIdent)
    //#pre[11] (int getMaxLength(String, String)): (soft) init'ed(this.cMyself.sNickname)
    //#pre[13] (int getMaxLength(String, String)): (soft) init'ed(this.lastLine)
    //#pre[14] (int getMaxLength(String, String)): (soft) this.myCallbackManager != null
    //#pre[15] (int getMaxLength(String, String)): (soft) this.myCallbackManager.callbackHash != null
    //#presumption(int getMaxLength(String, String)): java.lang.String:length(...)@1512 <= 2_147_484_153
    //#presumption(int getMaxLength(String, String)): java.lang.String:length(...)@1513 <= 2_147_484_153
    //#presumption(int getMaxLength(String, String)): java.lang.String:length(...)@1513 + length in {0..2_147_484_153}
    //#post(int getMaxLength(String, String)): return_value <= 2_147_484_153
    //#unanalyzed(int getMaxLength(String, String)): Effects-of-calling:isFake
    //#unanalyzed(int getMaxLength(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(int getMaxLength(String, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(int getMaxLength(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(int getMaxLength(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(int getMaxLength(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(int getMaxLength(String, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(int getMaxLength(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(int getMaxLength(String, String)): Effects-of-calling:call
    //#unanalyzed(int getMaxLength(String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(int getMaxLength(String, String)): Effects-of-calling:toString
    //#test_vector(int getMaxLength(String, String)): sTarget: Addr_Set{null}, Inverse{null}
    //#test_vector(int getMaxLength(String, String)): sType: Addr_Set{null}, Inverse{null}
		if (sType != null) { length = length + sType.length(); }
		if (sTarget != null) { length = length + sTarget.length(); }
		return getMaxLength(length);
    //#IRCParser.java:1514: end of method: int com.dmdirc.parser.irc.IRCParser.getMaxLength(String, String)
	}

	/**
	 * Get the max length a message can be.
	 *
	 * @param nLength Length of stuff. (Ie "PRIVMSG"+"#Channel")
	 * @return Max Length message should be.
	 */
	public int getMaxLength(final int nLength) {
		final int lineLint = 5;
    //#IRCParser.java:1524: method: int com.dmdirc.parser.irc.IRCParser.getMaxLength(int)
    //#IRCParser.java:1524: Warning: unused assignment
    //#    Unused assignment into lineLint
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: int getMaxLength(int)
    //#input(int getMaxLength(int)): "!"._tainted
    //#input(int getMaxLength(int)): "@"._tainted
    //#input(int getMaxLength(int)): "Callback not found: "._tainted
    //#input(int getMaxLength(int)): "OnErrorInfo"._tainted
    //#input(int getMaxLength(int)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(int getMaxLength(int)): __Descendant_Table[others]
    //#input(int getMaxLength(int)): __Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#input(int getMaxLength(int)): __Dispatch_Table.getLastLine()Ljava/lang/String;
    //#input(int getMaxLength(int)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(int getMaxLength(int)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(int getMaxLength(int)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(int getMaxLength(int)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(int getMaxLength(int)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(int getMaxLength(int)): nLength
    //#input(int getMaxLength(int)): this
    //#input(int getMaxLength(int)): this.__Tag
    //#input(int getMaxLength(int)): this.cMyself
    //#input(int getMaxLength(int)): this.cMyself.bIsFake
    //#input(int getMaxLength(int)): this.cMyself.sHost
    //#input(int getMaxLength(int)): this.cMyself.sHost._tainted
    //#input(int getMaxLength(int)): this.cMyself.sIdent
    //#input(int getMaxLength(int)): this.cMyself.sIdent._tainted
    //#input(int getMaxLength(int)): this.cMyself.sNickname
    //#input(int getMaxLength(int)): this.cMyself.sNickname._tainted
    //#input(int getMaxLength(int)): this.lastLine
    //#input(int getMaxLength(int)): this.myCallbackManager
    //#input(int getMaxLength(int)): this.myCallbackManager.callbackHash
    //#output(int getMaxLength(int)): return_value
    //#pre[1] (int getMaxLength(int)): nLength <= 2_147_484_153
    //#pre[4] (int getMaxLength(int)): this.cMyself != null
    //#pre[5] (int getMaxLength(int)): init'ed(this.cMyself.bIsFake)
    //#pre[3] (int getMaxLength(int)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[6] (int getMaxLength(int)): (soft) init'ed(this.cMyself.sHost)
    //#pre[9] (int getMaxLength(int)): (soft) init'ed(this.cMyself.sIdent)
    //#pre[11] (int getMaxLength(int)): (soft) init'ed(this.cMyself.sNickname)
    //#pre[14] (int getMaxLength(int)): (soft) init'ed(this.lastLine)
    //#pre[15] (int getMaxLength(int)): (soft) this.myCallbackManager != null
    //#pre[16] (int getMaxLength(int)): (soft) this.myCallbackManager.callbackHash != null
    //#presumption(int getMaxLength(int)): nLength + java.lang.String:length(...)@1529 in {-2_147_483_648..2_147_484_153}
    //#presumption(int getMaxLength(int)): toString(...)@1529 init'ed
    //#post(int getMaxLength(int)): return_value <= 2_147_484_153
    //#unanalyzed(int getMaxLength(int)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(int getMaxLength(int)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(int getMaxLength(int)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(int getMaxLength(int)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(int getMaxLength(int)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(int getMaxLength(int)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(int getMaxLength(int)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(int getMaxLength(int)): Effects-of-calling:call
    //#test_vector(int getMaxLength(int)): this.cMyself.bIsFake: {0}, {1}
		if (cMyself.isFake()) {
			callErrorInfo(new ParserError(ParserError.ERROR_ERROR + ParserError.ERROR_USER, "getMaxLength() called, but I don't know who I am?", getLastLine()));
			return MAX_LINELENGTH - nLength - lineLint;
		} else {
			return MAX_LINELENGTH - cMyself.toString().length() - nLength - lineLint;
    //#IRCParser.java:1529: end of method: int com.dmdirc.parser.irc.IRCParser.getMaxLength(int)
		}
	}

	/**
	 * Get the max number of list modes.
	 *
	 * @param mode The mode to know the max number for
	 * @return The max number of list modes for the given mode.
	 *         - returns 0 if MAXLIST does not contain the mode, unless MAXBANS is
	 *           set, then this is returned instead.
	 *         - returns -1 if:
	 *           - MAXLIST or MAXBANS were not in 005
	 *           - Values for MAXLIST or MAXBANS were invalid (non integer, empty)
	 */
	public int getMaxListModes(final char mode) {
		// MAXLIST=bdeI:50
		// MAXLIST=b:60,e:60,I:60
		// MAXBANS=30
		int result = -2;
    //#IRCParser.java:1548: method: int com.dmdirc.parser.irc.IRCParser.getMaxListModes(char)
    //#input(int getMaxListModes(char)): " ("._tainted
    //#input(int getMaxListModes(char)): " -> "._tainted
    //#input(int getMaxListModes(char)): " | parts.length = "._tainted
    //#input(int getMaxListModes(char)): "' | parts[1] = '"._tainted
    //#input(int getMaxListModes(char)): "'"._tainted
    //#input(int getMaxListModes(char)): ")"._tainted
    //#input(int getMaxListModes(char)): "Bit: "._tainted
    //#input(int getMaxListModes(char)): "Callback not found: "._tainted
    //#input(int getMaxListModes(char)): "Found maxlist ("._tainted
    //#input(int getMaxListModes(char)): "Looking for maxlistmodes for: "._tainted
    //#input(int getMaxListModes(char)): "OnDebugInfo"._tainted
    //#input(int getMaxListModes(char)): "OnErrorInfo"._tainted
    //#input(int getMaxListModes(char)): "Result: "._tainted
    //#input(int getMaxListModes(char)): "parts[0] = '"._tainted
    //#input(int getMaxListModes(char)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(int getMaxListModes(char)): __Descendant_Table[others]
    //#input(int getMaxListModes(char)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(int getMaxListModes(char)): __Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#input(int getMaxListModes(char)): __Dispatch_Table.getIRCD(Z)Ljava/lang/String;
    //#input(int getMaxListModes(char)): __Dispatch_Table.getLastLine()Ljava/lang/String;
    //#input(int getMaxListModes(char)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(int getMaxListModes(char)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(int getMaxListModes(char)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(int getMaxListModes(char)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(int getMaxListModes(char)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(int getMaxListModes(char)): mode
    //#input(int getMaxListModes(char)): this
    //#input(int getMaxListModes(char)): this.__Tag
    //#input(int getMaxListModes(char)): this.h005Info
    //#input(int getMaxListModes(char)): this.lastLine
    //#input(int getMaxListModes(char)): this.myCallbackManager
    //#input(int getMaxListModes(char)): this.myCallbackManager.callbackHash
    //#input(int getMaxListModes(char)): this.sNetworkName
    //#output(int getMaxListModes(char)): return_value
    //#pre[3] (int getMaxListModes(char)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[4] (int getMaxListModes(char)): this.h005Info != null
    //#pre[6] (int getMaxListModes(char)): this.myCallbackManager != null
    //#pre[7] (int getMaxListModes(char)): this.myCallbackManager.callbackHash != null
    //#pre[5] (int getMaxListModes(char)): (soft) init'ed(this.lastLine)
    //#pre[8] (int getMaxListModes(char)): (soft) this.sNetworkName != null
    //#presumption(int getMaxListModes(char)): java.util.Map:get(...)@1555 != null
    //#post(int getMaxListModes(char)): init'ed(return_value)
    //#unanalyzed(int getMaxListModes(char)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(int getMaxListModes(char)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(int getMaxListModes(char)): Effects-of-calling:java.lang.String:matches
    //#unanalyzed(int getMaxListModes(char)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(int getMaxListModes(char)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(int getMaxListModes(char)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(int getMaxListModes(char)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(int getMaxListModes(char)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(int getMaxListModes(char)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(int getMaxListModes(char)): Effects-of-calling:call
    //#unanalyzed(int getMaxListModes(char)): Effects-of-calling:java.lang.Integer:valueOf
    //#test_vector(int getMaxListModes(char)): java.lang.String:equalsIgnoreCase(...)@1577: {0}, {1}
    //#test_vector(int getMaxListModes(char)): java.util.Map:get(...)@1551: Addr_Set{null}, Inverse{null}
    //#test_vector(int getMaxListModes(char)): java.util.Map:get(...)@1552: Inverse{null}, Addr_Set{null}
    //#test_vector(int getMaxListModes(char)): java.util.Map:get(...)@1572: Addr_Set{null}, Inverse{null}
		callDebugInfo(DEBUG_INFO, "Looking for maxlistmodes for: "+mode);
		// Try in MAXLIST
		if (h005Info.get("MAXLIST") != null) {
			if (h005Info.get("MAXBANS") == null) {
				result = 0;
			}
			final String maxlist = h005Info.get("MAXLIST");
			callDebugInfo(DEBUG_INFO, "Found maxlist ("+maxlist+")");
			final String[] bits = maxlist.split(",");
			for (String bit : bits) {
    //#IRCParser.java:1558: ?use of default init
    //#    init'ed(arr$.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: int getMaxListModes(char)
    //#    basic block: bb_4
    //#    assertion: init'ed(arr$.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1558: ?use of default init
    //#    init'ed(len$)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: int getMaxListModes(char)
    //#    basic block: bb_5
    //#    assertion: init'ed(len$)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#IRCParser.java:1558: Warning: test always goes same way
    //#    Test predetermined because i$ == len$
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: int getMaxListModes(char)
    //#    from bb: bb_5
    //#    live edge: bb_5-->bb_12
    //#    tested vn: i$ - undefined
    //#    tested vn values: {0}
    //#IRCParser.java:1558: Warning: dead code
    //#    Dead code here because i$ == len$
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: int getMaxListModes(char)
    //#    dead bb: bb_6
    //#IRCParser.java:1558: Warning: dead code continues
    //#    Dead code continues
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: int getMaxListModes(char)
    //#    dead bb: bb_11
				final String[] parts = bit.split(":", 2);
				callDebugInfo(DEBUG_INFO, "Bit: "+bit+" | parts.length = "+parts.length+" ("+parts[0]+" -> "+parts[0].indexOf(mode)+")");
				if (parts.length == 2 && parts[0].indexOf(mode) > -1) {
    //#IRCParser.java:1561: Warning: dead code continues
    //#    Dead code continues
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: int getMaxListModes(char)
    //#    dead bb: bb_7
					callDebugInfo(DEBUG_INFO, "parts[0] = '"+parts[0]+"' | parts[1] = '"+parts[1]+"'");
    //#IRCParser.java:1562: Warning: dead code continues
    //#    Dead code continues
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: int getMaxListModes(char)
    //#    dead bb: bb_8
					try {
						result = Integer.parseInt(parts[1]);
    //#IRCParser.java:1564: Warning: dead code continues
    //#    Dead code continues
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: int getMaxListModes(char)
    //#    dead bb: bb_9
						break;
					} catch (NumberFormatException nfe) { result = -1; }
				}
			}
		}

		// If not in max list, try MAXBANS
		if (result == -2 && h005Info.get("MAXBANS") != null) {
			callDebugInfo(DEBUG_INFO, "Trying max bans");
			try {
				result = Integer.parseInt(h005Info.get("MAXBANS"));
			} catch (NumberFormatException nfe) { result = -1; }
		} else if (result == -2 && getIRCD(true).equalsIgnoreCase("weircd")) {
			// -_-
			result = 50;
		} else if (result == -2) {
			result = -1;
			callDebugInfo(DEBUG_INFO, "Failed");
			callErrorInfo(new ParserError(ParserError.ERROR_ERROR, "Unable to discover max list modes.", getLastLine()));
		}
		callDebugInfo(DEBUG_INFO, "Result: "+result);
		return result;
    //#IRCParser.java:1586: end of method: int com.dmdirc.parser.irc.IRCParser.getMaxListModes(char)
	}

	/**
	 * Send a private message to a target.
	 *
	 * @param sTarget Target
	 * @param sMessage Message to send
	 */
	public void sendMessage(final String sTarget, final String sMessage) {
		if (sTarget == null || sMessage == null) { return; }
    //#IRCParser.java:1596: method: void com.dmdirc.parser.irc.IRCParser.sendMessage(String, String)
    //#input(void sendMessage(String, String)): " :"._tainted
    //#input(void sendMessage(String, String)): " for mode "._tainted
    //#input(void sendMessage(String, String)): "Callback not found: "._tainted
    //#input(void sendMessage(String, String)): "Intercepted mode request for "._tainted
    //#input(void sendMessage(String, String)): "OnDataOut"._tainted
    //#input(void sendMessage(String, String)): "OnDebugInfo"._tainted
    //#input(void sendMessage(String, String)): "PRIVMSG "._tainted
    //#input(void sendMessage(String, String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendMessage(String, String)): __Descendant_Table[others]
    //#input(void sendMessage(String, String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendMessage(String, String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendMessage(String, String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendMessage(String, String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendMessage(String, String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendMessage(String, String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendMessage(String, String)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void sendMessage(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendMessage(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void sendMessage(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendMessage(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendMessage(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendMessage(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendMessage(String, String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendMessage(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendMessage(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendMessage(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendMessage(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendMessage(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendMessage(String, String)): sMessage
    //#input(void sendMessage(String, String)): sMessage._tainted
    //#input(void sendMessage(String, String)): sTarget
    //#input(void sendMessage(String, String)): sTarget._tainted
    //#input(void sendMessage(String, String)): this
    //#input(void sendMessage(String, String)): this.__Tag
    //#input(void sendMessage(String, String)): this.cMyself
    //#input(void sendMessage(String, String)): this.currentSocketState
    //#input(void sendMessage(String, String)): this.hChanModesOther
    //#input(void sendMessage(String, String)): this.hChannelList
    //#input(void sendMessage(String, String)): this.myCallbackManager
    //#input(void sendMessage(String, String)): this.myCallbackManager.callbackHash
    //#input(void sendMessage(String, String)): this.out
    //#input(void sendMessage(String, String)): this.stringConverter
    //#input(void sendMessage(String, String)): this.stringConverter.__Tag
    //#input(void sendMessage(String, String)): this.stringConverter.lowercase
    //#input(void sendMessage(String, String)): this.stringConverter.lowercase.length
    //#output(void sendMessage(String, String)): java.lang.String:substring(...)._tainted
    //#output(void sendMessage(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendMessage(String, String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendMessage(String, String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendMessage(String, String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendMessage(String, String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendMessage(String, String)): new char[](IRCStringConverter#1) num objects
    //#output(void sendMessage(String, String)): new char[](IRCStringConverter#1).length
    //#output(void sendMessage(String, String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendMessage(String, String)): new char[](IRCStringConverter#2) num objects
    //#output(void sendMessage(String, String)): new char[](IRCStringConverter#2).length
    //#output(void sendMessage(String, String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendMessage(String, String)): this.cMyself.myAwayReason
    //#output(void sendMessage(String, String)): this.stringConverter
    //#new obj(void sendMessage(String, String)): java.lang.String:substring(...)
    //#new obj(void sendMessage(String, String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendMessage(String, String)): new char[](IRCStringConverter#1)
    //#new obj(void sendMessage(String, String)): new char[](IRCStringConverter#2)
    //#pre[5] (void sendMessage(String, String)): (soft) init'ed(this.stringConverter)
    //#pre[12] (void sendMessage(String, String)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[13] (void sendMessage(String, String)): (soft) this.cMyself != null
    //#pre[14] (void sendMessage(String, String)): (soft) init'ed(this.currentSocketState)
    //#pre[15] (void sendMessage(String, String)): (soft) this.hChanModesOther != null
    //#pre[16] (void sendMessage(String, String)): (soft) this.hChannelList != null
    //#pre[18] (void sendMessage(String, String)): (soft) this.myCallbackManager != null
    //#pre[19] (void sendMessage(String, String)): (soft) this.myCallbackManager.callbackHash != null
    //#pre[20] (void sendMessage(String, String)): (soft) init'ed(this.out)
    //#post(void sendMessage(String, String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendMessage(String, String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void sendMessage(String, String)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendMessage(String, String)): init'ed(this.stringConverter)
    //#post(void sendMessage(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendMessage(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendMessage(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendMessage(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendMessage(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendMessage(String, String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void sendMessage(String, String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendMessage(String, String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendMessage(String, String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void sendMessage(String, String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendMessage(String, String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:doSendString
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:call
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void sendMessage(String, String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#test_vector(void sendMessage(String, String)): sMessage: Inverse{null}, Addr_Set{null}
    //#test_vector(void sendMessage(String, String)): sTarget: Addr_Set{null}, Inverse{null}
    //#test_vector(void sendMessage(String, String)): java.lang.String:isEmpty(...)@1597: {0}, {1}
		if (sTarget.isEmpty()/* || sMessage.isEmpty()*/) { return; }

		sendString("PRIVMSG " + sTarget + " :" + sMessage);
	}
    //#IRCParser.java:1600: end of method: void com.dmdirc.parser.irc.IRCParser.sendMessage(String, String)

	/**
	 * Send a notice message to a target.
	 *
	 * @param sTarget Target
	 * @param sMessage Message to send
	 */
	public void sendNotice(final String sTarget, final String sMessage) {
		if (sTarget == null || sMessage == null) { return; }
    //#IRCParser.java:1609: method: void com.dmdirc.parser.irc.IRCParser.sendNotice(String, String)
    //#input(void sendNotice(String, String)): " :"._tainted
    //#input(void sendNotice(String, String)): " for mode "._tainted
    //#input(void sendNotice(String, String)): "Callback not found: "._tainted
    //#input(void sendNotice(String, String)): "Intercepted mode request for "._tainted
    //#input(void sendNotice(String, String)): "NOTICE "._tainted
    //#input(void sendNotice(String, String)): "OnDataOut"._tainted
    //#input(void sendNotice(String, String)): "OnDebugInfo"._tainted
    //#input(void sendNotice(String, String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendNotice(String, String)): __Descendant_Table[others]
    //#input(void sendNotice(String, String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendNotice(String, String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendNotice(String, String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendNotice(String, String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendNotice(String, String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendNotice(String, String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendNotice(String, String)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void sendNotice(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendNotice(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void sendNotice(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendNotice(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendNotice(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendNotice(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendNotice(String, String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendNotice(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendNotice(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendNotice(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendNotice(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendNotice(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendNotice(String, String)): sMessage
    //#input(void sendNotice(String, String)): sMessage._tainted
    //#input(void sendNotice(String, String)): sTarget
    //#input(void sendNotice(String, String)): sTarget._tainted
    //#input(void sendNotice(String, String)): this
    //#input(void sendNotice(String, String)): this.__Tag
    //#input(void sendNotice(String, String)): this.cMyself
    //#input(void sendNotice(String, String)): this.currentSocketState
    //#input(void sendNotice(String, String)): this.hChanModesOther
    //#input(void sendNotice(String, String)): this.hChannelList
    //#input(void sendNotice(String, String)): this.myCallbackManager
    //#input(void sendNotice(String, String)): this.myCallbackManager.callbackHash
    //#input(void sendNotice(String, String)): this.out
    //#input(void sendNotice(String, String)): this.stringConverter
    //#input(void sendNotice(String, String)): this.stringConverter.__Tag
    //#input(void sendNotice(String, String)): this.stringConverter.lowercase
    //#input(void sendNotice(String, String)): this.stringConverter.lowercase.length
    //#output(void sendNotice(String, String)): java.lang.String:substring(...)._tainted
    //#output(void sendNotice(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendNotice(String, String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendNotice(String, String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendNotice(String, String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendNotice(String, String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendNotice(String, String)): new char[](IRCStringConverter#1) num objects
    //#output(void sendNotice(String, String)): new char[](IRCStringConverter#1).length
    //#output(void sendNotice(String, String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendNotice(String, String)): new char[](IRCStringConverter#2) num objects
    //#output(void sendNotice(String, String)): new char[](IRCStringConverter#2).length
    //#output(void sendNotice(String, String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendNotice(String, String)): this.cMyself.myAwayReason
    //#output(void sendNotice(String, String)): this.stringConverter
    //#new obj(void sendNotice(String, String)): java.lang.String:substring(...)
    //#new obj(void sendNotice(String, String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendNotice(String, String)): new char[](IRCStringConverter#1)
    //#new obj(void sendNotice(String, String)): new char[](IRCStringConverter#2)
    //#pre[5] (void sendNotice(String, String)): (soft) init'ed(this.stringConverter)
    //#pre[12] (void sendNotice(String, String)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[13] (void sendNotice(String, String)): (soft) this.cMyself != null
    //#pre[14] (void sendNotice(String, String)): (soft) init'ed(this.currentSocketState)
    //#pre[15] (void sendNotice(String, String)): (soft) this.hChanModesOther != null
    //#pre[16] (void sendNotice(String, String)): (soft) this.hChannelList != null
    //#pre[18] (void sendNotice(String, String)): (soft) this.myCallbackManager != null
    //#pre[19] (void sendNotice(String, String)): (soft) this.myCallbackManager.callbackHash != null
    //#pre[20] (void sendNotice(String, String)): (soft) init'ed(this.out)
    //#post(void sendNotice(String, String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendNotice(String, String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void sendNotice(String, String)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendNotice(String, String)): init'ed(this.stringConverter)
    //#post(void sendNotice(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendNotice(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendNotice(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendNotice(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendNotice(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendNotice(String, String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void sendNotice(String, String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendNotice(String, String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendNotice(String, String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void sendNotice(String, String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendNotice(String, String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:doSendString
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:call
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void sendNotice(String, String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#test_vector(void sendNotice(String, String)): sMessage: Inverse{null}, Addr_Set{null}
    //#test_vector(void sendNotice(String, String)): sTarget: Addr_Set{null}, Inverse{null}
    //#test_vector(void sendNotice(String, String)): java.lang.String:isEmpty(...)@1610: {0}, {1}
		if (sTarget.isEmpty()/* || sMessage.isEmpty()*/) { return; }

		sendString("NOTICE " + sTarget + " :" + sMessage);
	}
    //#IRCParser.java:1613: end of method: void com.dmdirc.parser.irc.IRCParser.sendNotice(String, String)

	/**
	 * Send a Action to a target.
	 *
	 * @param sTarget Target
	 * @param sMessage Action to send
	 */
	public void sendAction(final String sTarget, final String sMessage) {
		sendCTCP(sTarget, "ACTION", sMessage);
    //#IRCParser.java:1622: method: void com.dmdirc.parser.irc.IRCParser.sendAction(String, String)
    //#input(void sendAction(String, String)): " "._tainted
    //#input(void sendAction(String, String)): " :"._tainted
    //#input(void sendAction(String, String)): " for mode "._tainted
    //#input(void sendAction(String, String)): "Callback not found: "._tainted
    //#input(void sendAction(String, String)): "Intercepted mode request for "._tainted
    //#input(void sendAction(String, String)): "OnDataOut"._tainted
    //#input(void sendAction(String, String)): "OnDebugInfo"._tainted
    //#input(void sendAction(String, String)): "PRIVMSG "._tainted
    //#input(void sendAction(String, String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendAction(String, String)): __Descendant_Table[others]
    //#input(void sendAction(String, String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendAction(String, String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendAction(String, String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendAction(String, String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendAction(String, String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendAction(String, String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendAction(String, String)): __Dispatch_Table.sendCTCP(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#input(void sendAction(String, String)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void sendAction(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendAction(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void sendAction(String, String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendAction(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendAction(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendAction(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendAction(String, String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendAction(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendAction(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendAction(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendAction(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendAction(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendAction(String, String)): sMessage
    //#input(void sendAction(String, String)): sMessage._tainted
    //#input(void sendAction(String, String)): sTarget
    //#input(void sendAction(String, String)): sTarget._tainted
    //#input(void sendAction(String, String)): this
    //#input(void sendAction(String, String)): this.__Tag
    //#input(void sendAction(String, String)): this.cMyself
    //#input(void sendAction(String, String)): this.currentSocketState
    //#input(void sendAction(String, String)): this.hChanModesOther
    //#input(void sendAction(String, String)): this.hChannelList
    //#input(void sendAction(String, String)): this.myCallbackManager
    //#input(void sendAction(String, String)): this.myCallbackManager.callbackHash
    //#input(void sendAction(String, String)): this.out
    //#input(void sendAction(String, String)): this.stringConverter
    //#input(void sendAction(String, String)): this.stringConverter.__Tag
    //#input(void sendAction(String, String)): this.stringConverter.lowercase
    //#input(void sendAction(String, String)): this.stringConverter.lowercase.length
    //#output(void sendAction(String, String)): java.lang.String:substring(...)._tainted
    //#output(void sendAction(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendAction(String, String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendAction(String, String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendAction(String, String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendAction(String, String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendAction(String, String)): new char[](IRCStringConverter#1) num objects
    //#output(void sendAction(String, String)): new char[](IRCStringConverter#1).length
    //#output(void sendAction(String, String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendAction(String, String)): new char[](IRCStringConverter#2) num objects
    //#output(void sendAction(String, String)): new char[](IRCStringConverter#2).length
    //#output(void sendAction(String, String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendAction(String, String)): this.cMyself.myAwayReason
    //#output(void sendAction(String, String)): this.stringConverter
    //#new obj(void sendAction(String, String)): java.lang.String:substring(...)
    //#new obj(void sendAction(String, String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendAction(String, String)): new char[](IRCStringConverter#1)
    //#new obj(void sendAction(String, String)): new char[](IRCStringConverter#2)
    //#pre[5] (void sendAction(String, String)): (soft) init'ed(this.stringConverter)
    //#pre[11] (void sendAction(String, String)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[12] (void sendAction(String, String)): (soft) this.cMyself != null
    //#pre[13] (void sendAction(String, String)): (soft) init'ed(this.currentSocketState)
    //#pre[14] (void sendAction(String, String)): (soft) this.hChanModesOther != null
    //#pre[15] (void sendAction(String, String)): (soft) this.hChannelList != null
    //#pre[17] (void sendAction(String, String)): (soft) this.myCallbackManager != null
    //#pre[18] (void sendAction(String, String)): (soft) this.myCallbackManager.callbackHash != null
    //#pre[19] (void sendAction(String, String)): (soft) init'ed(this.out)
    //#post(void sendAction(String, String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendAction(String, String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void sendAction(String, String)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendAction(String, String)): init'ed(this.stringConverter)
    //#post(void sendAction(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendAction(String, String)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void sendAction(String, String)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void sendAction(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendAction(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendAction(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendAction(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendAction(String, String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendAction(String, String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendAction(String, String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendAction(String, String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:doSendString
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:call
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.String:toUpperCase
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void sendAction(String, String)): Effects-of-calling:java.lang.System:currentTimeMillis
	}
    //#IRCParser.java:1623: end of method: void com.dmdirc.parser.irc.IRCParser.sendAction(String, String)

	/**
	 * Send a CTCP to a target.
	 *
	 * @param sTarget Target
	 * @param sType Type of CTCP
	 * @param sMessage Optional Additional Parameters
	 */
	public void sendCTCP(final String sTarget, final String sType, final String sMessage) {
		if (sTarget == null || sMessage == null) { return; }
    //#IRCParser.java:1633: method: void com.dmdirc.parser.irc.IRCParser.sendCTCP(String, String, String)
    //#input(void sendCTCP(String, String, String)): " "._tainted
    //#input(void sendCTCP(String, String, String)): " :"._tainted
    //#input(void sendCTCP(String, String, String)): " for mode "._tainted
    //#input(void sendCTCP(String, String, String)): "Callback not found: "._tainted
    //#input(void sendCTCP(String, String, String)): "Intercepted mode request for "._tainted
    //#input(void sendCTCP(String, String, String)): "OnDataOut"._tainted
    //#input(void sendCTCP(String, String, String)): "OnDebugInfo"._tainted
    //#input(void sendCTCP(String, String, String)): "PRIVMSG "._tainted
    //#input(void sendCTCP(String, String, String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendCTCP(String, String, String)): __Descendant_Table[others]
    //#input(void sendCTCP(String, String, String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendCTCP(String, String, String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendCTCP(String, String, String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendCTCP(String, String, String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendCTCP(String, String, String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendCTCP(String, String, String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendCTCP(String, String, String)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void sendCTCP(String, String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendCTCP(String, String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void sendCTCP(String, String, String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendCTCP(String, String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendCTCP(String, String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendCTCP(String, String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendCTCP(String, String, String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendCTCP(String, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendCTCP(String, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendCTCP(String, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendCTCP(String, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendCTCP(String, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendCTCP(String, String, String)): sMessage
    //#input(void sendCTCP(String, String, String)): sMessage._tainted
    //#input(void sendCTCP(String, String, String)): sTarget
    //#input(void sendCTCP(String, String, String)): sTarget._tainted
    //#input(void sendCTCP(String, String, String)): sType
    //#input(void sendCTCP(String, String, String)): this
    //#input(void sendCTCP(String, String, String)): this.__Tag
    //#input(void sendCTCP(String, String, String)): this.cMyself
    //#input(void sendCTCP(String, String, String)): this.currentSocketState
    //#input(void sendCTCP(String, String, String)): this.hChanModesOther
    //#input(void sendCTCP(String, String, String)): this.hChannelList
    //#input(void sendCTCP(String, String, String)): this.myCallbackManager
    //#input(void sendCTCP(String, String, String)): this.myCallbackManager.callbackHash
    //#input(void sendCTCP(String, String, String)): this.out
    //#input(void sendCTCP(String, String, String)): this.stringConverter
    //#input(void sendCTCP(String, String, String)): this.stringConverter.__Tag
    //#input(void sendCTCP(String, String, String)): this.stringConverter.lowercase
    //#input(void sendCTCP(String, String, String)): this.stringConverter.lowercase.length
    //#output(void sendCTCP(String, String, String)): java.lang.String:substring(...)._tainted
    //#output(void sendCTCP(String, String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendCTCP(String, String, String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendCTCP(String, String, String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendCTCP(String, String, String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendCTCP(String, String, String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendCTCP(String, String, String)): new char[](IRCStringConverter#1) num objects
    //#output(void sendCTCP(String, String, String)): new char[](IRCStringConverter#1).length
    //#output(void sendCTCP(String, String, String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendCTCP(String, String, String)): new char[](IRCStringConverter#2) num objects
    //#output(void sendCTCP(String, String, String)): new char[](IRCStringConverter#2).length
    //#output(void sendCTCP(String, String, String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendCTCP(String, String, String)): this.cMyself.myAwayReason
    //#output(void sendCTCP(String, String, String)): this.stringConverter
    //#new obj(void sendCTCP(String, String, String)): java.lang.String:substring(...)
    //#new obj(void sendCTCP(String, String, String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendCTCP(String, String, String)): new char[](IRCStringConverter#1)
    //#new obj(void sendCTCP(String, String, String)): new char[](IRCStringConverter#2)
    //#pre[5] (void sendCTCP(String, String, String)): (soft) init'ed(this.stringConverter)
    //#pre[10] (void sendCTCP(String, String, String)): (soft) sType != null
    //#pre[12] (void sendCTCP(String, String, String)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[13] (void sendCTCP(String, String, String)): (soft) this.cMyself != null
    //#pre[14] (void sendCTCP(String, String, String)): (soft) init'ed(this.currentSocketState)
    //#pre[15] (void sendCTCP(String, String, String)): (soft) this.hChanModesOther != null
    //#pre[16] (void sendCTCP(String, String, String)): (soft) this.hChannelList != null
    //#pre[18] (void sendCTCP(String, String, String)): (soft) this.myCallbackManager != null
    //#pre[19] (void sendCTCP(String, String, String)): (soft) this.myCallbackManager.callbackHash != null
    //#pre[20] (void sendCTCP(String, String, String)): (soft) init'ed(this.out)
    //#post(void sendCTCP(String, String, String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendCTCP(String, String, String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void sendCTCP(String, String, String)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendCTCP(String, String, String)): init'ed(this.stringConverter)
    //#post(void sendCTCP(String, String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendCTCP(String, String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendCTCP(String, String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendCTCP(String, String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendCTCP(String, String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendCTCP(String, String, String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void sendCTCP(String, String, String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendCTCP(String, String, String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendCTCP(String, String, String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void sendCTCP(String, String, String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendCTCP(String, String, String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:doSendString
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:call
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void sendCTCP(String, String, String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#test_vector(void sendCTCP(String, String, String)): sMessage: Inverse{null}, Addr_Set{null}
    //#test_vector(void sendCTCP(String, String, String)): sTarget: Addr_Set{null}, Inverse{null}
    //#test_vector(void sendCTCP(String, String, String)): java.lang.String:isEmpty(...)@1634: {1}, {0}
    //#test_vector(void sendCTCP(String, String, String)): java.lang.String:isEmpty(...)@1634: {0}, {1}
		if (sTarget.isEmpty() || sType.isEmpty()) { return; }
		final char char1 = (char) 1;
    //#IRCParser.java:1635: Warning: unused assignment
    //#    Unused assignment into char1
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void sendCTCP(String, String, String)
		sendString("PRIVMSG " + sTarget + " :" + char1 + sType.toUpperCase() + " " + sMessage + char1);
	}
    //#IRCParser.java:1637: end of method: void com.dmdirc.parser.irc.IRCParser.sendCTCP(String, String, String)

	/**
	 * Send a CTCPReply to a target.
	 *
	 * @param sTarget Target
	 * @param sType Type of CTCP
	 * @param sMessage Optional Additional Parameters
	 */
	public void sendCTCPReply(final String sTarget, final String sType, final String sMessage) {
		if (sTarget == null || sMessage == null) { return; }
    //#IRCParser.java:1647: method: void com.dmdirc.parser.irc.IRCParser.sendCTCPReply(String, String, String)
    //#input(void sendCTCPReply(String, String, String)): " "._tainted
    //#input(void sendCTCPReply(String, String, String)): " :"._tainted
    //#input(void sendCTCPReply(String, String, String)): " for mode "._tainted
    //#input(void sendCTCPReply(String, String, String)): "Callback not found: "._tainted
    //#input(void sendCTCPReply(String, String, String)): "Intercepted mode request for "._tainted
    //#input(void sendCTCPReply(String, String, String)): "NOTICE "._tainted
    //#input(void sendCTCPReply(String, String, String)): "OnDataOut"._tainted
    //#input(void sendCTCPReply(String, String, String)): "OnDebugInfo"._tainted
    //#input(void sendCTCPReply(String, String, String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendCTCPReply(String, String, String)): __Descendant_Table[others]
    //#input(void sendCTCPReply(String, String, String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendCTCPReply(String, String, String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendCTCPReply(String, String, String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendCTCPReply(String, String, String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendCTCPReply(String, String, String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendCTCPReply(String, String, String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendCTCPReply(String, String, String)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void sendCTCPReply(String, String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendCTCPReply(String, String, String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void sendCTCPReply(String, String, String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendCTCPReply(String, String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendCTCPReply(String, String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendCTCPReply(String, String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendCTCPReply(String, String, String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendCTCPReply(String, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendCTCPReply(String, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendCTCPReply(String, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendCTCPReply(String, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendCTCPReply(String, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendCTCPReply(String, String, String)): sMessage
    //#input(void sendCTCPReply(String, String, String)): sMessage._tainted
    //#input(void sendCTCPReply(String, String, String)): sTarget
    //#input(void sendCTCPReply(String, String, String)): sTarget._tainted
    //#input(void sendCTCPReply(String, String, String)): sType
    //#input(void sendCTCPReply(String, String, String)): this
    //#input(void sendCTCPReply(String, String, String)): this.__Tag
    //#input(void sendCTCPReply(String, String, String)): this.cMyself
    //#input(void sendCTCPReply(String, String, String)): this.currentSocketState
    //#input(void sendCTCPReply(String, String, String)): this.hChanModesOther
    //#input(void sendCTCPReply(String, String, String)): this.hChannelList
    //#input(void sendCTCPReply(String, String, String)): this.myCallbackManager
    //#input(void sendCTCPReply(String, String, String)): this.myCallbackManager.callbackHash
    //#input(void sendCTCPReply(String, String, String)): this.out
    //#input(void sendCTCPReply(String, String, String)): this.stringConverter
    //#input(void sendCTCPReply(String, String, String)): this.stringConverter.__Tag
    //#input(void sendCTCPReply(String, String, String)): this.stringConverter.lowercase
    //#input(void sendCTCPReply(String, String, String)): this.stringConverter.lowercase.length
    //#output(void sendCTCPReply(String, String, String)): java.lang.String:substring(...)._tainted
    //#output(void sendCTCPReply(String, String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendCTCPReply(String, String, String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendCTCPReply(String, String, String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendCTCPReply(String, String, String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendCTCPReply(String, String, String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendCTCPReply(String, String, String)): new char[](IRCStringConverter#1) num objects
    //#output(void sendCTCPReply(String, String, String)): new char[](IRCStringConverter#1).length
    //#output(void sendCTCPReply(String, String, String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendCTCPReply(String, String, String)): new char[](IRCStringConverter#2) num objects
    //#output(void sendCTCPReply(String, String, String)): new char[](IRCStringConverter#2).length
    //#output(void sendCTCPReply(String, String, String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendCTCPReply(String, String, String)): this.cMyself.myAwayReason
    //#output(void sendCTCPReply(String, String, String)): this.stringConverter
    //#new obj(void sendCTCPReply(String, String, String)): java.lang.String:substring(...)
    //#new obj(void sendCTCPReply(String, String, String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendCTCPReply(String, String, String)): new char[](IRCStringConverter#1)
    //#new obj(void sendCTCPReply(String, String, String)): new char[](IRCStringConverter#2)
    //#pre[5] (void sendCTCPReply(String, String, String)): (soft) init'ed(this.stringConverter)
    //#pre[10] (void sendCTCPReply(String, String, String)): (soft) sType != null
    //#pre[12] (void sendCTCPReply(String, String, String)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[13] (void sendCTCPReply(String, String, String)): (soft) this.cMyself != null
    //#pre[14] (void sendCTCPReply(String, String, String)): (soft) init'ed(this.currentSocketState)
    //#pre[15] (void sendCTCPReply(String, String, String)): (soft) this.hChanModesOther != null
    //#pre[16] (void sendCTCPReply(String, String, String)): (soft) this.hChannelList != null
    //#pre[18] (void sendCTCPReply(String, String, String)): (soft) this.myCallbackManager != null
    //#pre[19] (void sendCTCPReply(String, String, String)): (soft) this.myCallbackManager.callbackHash != null
    //#pre[20] (void sendCTCPReply(String, String, String)): (soft) init'ed(this.out)
    //#post(void sendCTCPReply(String, String, String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendCTCPReply(String, String, String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void sendCTCPReply(String, String, String)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendCTCPReply(String, String, String)): init'ed(this.stringConverter)
    //#post(void sendCTCPReply(String, String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendCTCPReply(String, String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendCTCPReply(String, String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendCTCPReply(String, String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendCTCPReply(String, String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendCTCPReply(String, String, String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void sendCTCPReply(String, String, String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendCTCPReply(String, String, String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendCTCPReply(String, String, String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void sendCTCPReply(String, String, String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendCTCPReply(String, String, String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:doSendString
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:call
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void sendCTCPReply(String, String, String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#test_vector(void sendCTCPReply(String, String, String)): sMessage: Inverse{null}, Addr_Set{null}
    //#test_vector(void sendCTCPReply(String, String, String)): sTarget: Addr_Set{null}, Inverse{null}
    //#test_vector(void sendCTCPReply(String, String, String)): java.lang.String:isEmpty(...)@1648: {1}, {0}
    //#test_vector(void sendCTCPReply(String, String, String)): java.lang.String:isEmpty(...)@1648: {0}, {1}
		if (sTarget.isEmpty() || sType.isEmpty()) { return; }
		final char char1 = (char) 1;
    //#IRCParser.java:1649: Warning: unused assignment
    //#    Unused assignment into char1
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void sendCTCPReply(String, String, String)
		sendString("NOTICE " + sTarget + " :" + char1 + sType.toUpperCase() + " " + sMessage + char1);
	}
    //#IRCParser.java:1651: end of method: void com.dmdirc.parser.irc.IRCParser.sendCTCPReply(String, String, String)

	/**
	 * Quit IRC.
	 * This method will wait for the server to close the socket.
	 *
	 * @param sReason Reason for quitting.
	 */
	public void quit(final String sReason) {
		if (sReason.isEmpty()) {
    //#IRCParser.java:1660: method: void com.dmdirc.parser.irc.IRCParser.quit(String)
    //#input(void quit(String)): " for mode "._tainted
    //#input(void quit(String)): "Callback not found: "._tainted
    //#input(void quit(String)): "Intercepted mode request for "._tainted
    //#input(void quit(String)): "OnDataOut"._tainted
    //#input(void quit(String)): "OnDebugInfo"._tainted
    //#input(void quit(String)): "QUIT :"._tainted
    //#input(void quit(String)): "QUIT"._tainted
    //#input(void quit(String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void quit(String)): __Descendant_Table[others]
    //#input(void quit(String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void quit(String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void quit(String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void quit(String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void quit(String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void quit(String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void quit(String)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void quit(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void quit(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void quit(String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void quit(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void quit(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void quit(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void quit(String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void quit(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void quit(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void quit(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void quit(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void quit(String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void quit(String)): sReason
    //#input(void quit(String)): sReason._tainted
    //#input(void quit(String)): this
    //#input(void quit(String)): this.__Tag
    //#input(void quit(String)): this.cMyself
    //#input(void quit(String)): this.currentSocketState
    //#input(void quit(String)): this.hChanModesOther
    //#input(void quit(String)): this.hChannelList
    //#input(void quit(String)): this.myCallbackManager
    //#input(void quit(String)): this.myCallbackManager.callbackHash
    //#input(void quit(String)): this.out
    //#input(void quit(String)): this.stringConverter
    //#input(void quit(String)): this.stringConverter.__Tag
    //#input(void quit(String)): this.stringConverter.lowercase
    //#input(void quit(String)): this.stringConverter.lowercase.length
    //#output(void quit(String)): java.lang.String:substring(...)._tainted
    //#output(void quit(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void quit(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void quit(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void quit(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void quit(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void quit(String)): new char[](IRCStringConverter#1) num objects
    //#output(void quit(String)): new char[](IRCStringConverter#1).length
    //#output(void quit(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void quit(String)): new char[](IRCStringConverter#2) num objects
    //#output(void quit(String)): new char[](IRCStringConverter#2).length
    //#output(void quit(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void quit(String)): this.cMyself.myAwayReason
    //#output(void quit(String)): this.stringConverter
    //#new obj(void quit(String)): java.lang.String:substring(...)
    //#new obj(void quit(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void quit(String)): new char[](IRCStringConverter#1)
    //#new obj(void quit(String)): new char[](IRCStringConverter#2)
    //#pre[3] (void quit(String)): sReason != null
    //#pre[6] (void quit(String)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[14] (void quit(String)): init'ed(this.out)
    //#pre[2] (void quit(String)): (soft) init'ed(this.stringConverter)
    //#pre[7] (void quit(String)): (soft) this.cMyself != null
    //#pre[8] (void quit(String)): (soft) init'ed(this.currentSocketState)
    //#pre[9] (void quit(String)): (soft) this.hChanModesOther != null
    //#pre[10] (void quit(String)): (soft) this.hChannelList != null
    //#pre[12] (void quit(String)): (soft) this.myCallbackManager != null
    //#pre[13] (void quit(String)): (soft) this.myCallbackManager.callbackHash != null
    //#post(void quit(String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void quit(String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void quit(String)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void quit(String)): init'ed(this.stringConverter)
    //#post(void quit(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void quit(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void quit(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void quit(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void quit(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void quit(String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void quit(String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void quit(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void quit(String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void quit(String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void quit(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void quit(String)): Effects-of-calling:doSendString
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void quit(String)): Effects-of-calling:call
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void quit(String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void quit(String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void quit(String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void quit(String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void quit(String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#test_vector(void quit(String)): java.lang.String:isEmpty(...)@1660: {0}, {1}
			sendString("QUIT");
		} else {
			sendString("QUIT :" + sReason);
		}
	}
    //#IRCParser.java:1665: end of method: void com.dmdirc.parser.irc.IRCParser.quit(String)
	/**
	 * Disconnect from server.
	 * This method will quit and automatically close the socket without waiting for
	 * the server.
	 *
	 * @param sReason Reason for quitting.
	 */
	public void disconnect(final String sReason) {
		if (currentSocketState == SocketState.OPEN && got001) { quit(sReason); }
    //#IRCParser.java:1674: method: void com.dmdirc.parser.irc.IRCParser.disconnect(String)
    //#input(void disconnect(String)): " for mode "._tainted
    //#input(void disconnect(String)): "Callback not found: "._tainted
    //#input(void disconnect(String)): "Intercepted mode request for "._tainted
    //#input(void disconnect(String)): "OnDataOut"._tainted
    //#input(void disconnect(String)): "OnDebugInfo"._tainted
    //#input(void disconnect(String)): "OnSocketClosed"._tainted
    //#input(void disconnect(String)): "QUIT :"._tainted
    //#input(void disconnect(String)): "QUIT"._tainted
    //#input(void disconnect(String)): "myself"._tainted
    //#input(void disconnect(String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void disconnect(String)): __Descendant_Table[others]
    //#input(void disconnect(String)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void disconnect(String)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void disconnect(String)): __Dispatch_Table.callSocketClosed()Z
    //#input(void disconnect(String)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void disconnect(String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void disconnect(String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void disconnect(String)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void disconnect(String)): __Dispatch_Table.quit(Ljava/lang/String;)V
    //#input(void disconnect(String)): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void disconnect(String)): __Dispatch_Table.updateCharArrays(B)V
    //#input(void disconnect(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void disconnect(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void disconnect(String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void disconnect(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void disconnect(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void disconnect(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void disconnect(String)): com/dmdirc/parser/irc/SocketState.CLOSED
    //#input(void disconnect(String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void disconnect(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void disconnect(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void disconnect(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void disconnect(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void disconnect(String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void disconnect(String)): sReason
    //#input(void disconnect(String)): sReason._tainted
    //#input(void disconnect(String)): this
    //#input(void disconnect(String)): this.__Tag
    //#input(void disconnect(String)): this.cMyself
    //#input(void disconnect(String)): this.currentSocketState
    //#input(void disconnect(String)): this.got001
    //#input(void disconnect(String)): this.h005Info
    //#input(void disconnect(String)): this.hChanModesBool
    //#input(void disconnect(String)): this.hChanModesOther
    //#input(void disconnect(String)): this.hChanPrefix
    //#input(void disconnect(String)): this.hChannelList
    //#input(void disconnect(String)): this.hClientList
    //#input(void disconnect(String)): this.hPrefixMap
    //#input(void disconnect(String)): this.hPrefixModes
    //#input(void disconnect(String)): this.hUserModes
    //#input(void disconnect(String)): this.myCallbackManager
    //#input(void disconnect(String)): this.myCallbackManager.callbackHash
    //#input(void disconnect(String)): this.out
    //#input(void disconnect(String)): this.pingTimer
    //#input(void disconnect(String)): this.pingTimerSem
    //#input(void disconnect(String)): this.socket
    //#input(void disconnect(String)): this.stringConverter
    //#input(void disconnect(String)): this.stringConverter.__Tag
    //#input(void disconnect(String)): this.stringConverter.lowercase
    //#input(void disconnect(String)): this.stringConverter.lowercase.length
    //#output(void disconnect(String)): java.lang.String:substring(...)._tainted
    //#output(void disconnect(String)): new ClientInfo(resetState#1) num objects
    //#output(void disconnect(String)): new ClientInfo(resetState#1).__Tag
    //#output(void disconnect(String)): new ClientInfo(resetState#1).bIsFake
    //#output(void disconnect(String)): new ClientInfo(resetState#1).lModeQueue
    //#output(void disconnect(String)): new ClientInfo(resetState#1).myAwayReason
    //#output(void disconnect(String)): new ClientInfo(resetState#1).myChannelClientInfos
    //#output(void disconnect(String)): new ClientInfo(resetState#1).myMap
    //#output(void disconnect(String)): new ClientInfo(resetState#1).myParser
    //#output(void disconnect(String)): new ClientInfo(resetState#1).sHost
    //#output(void disconnect(String)): new ClientInfo(resetState#1).sIdent
    //#output(void disconnect(String)): new ClientInfo(resetState#1).sNickname
    //#output(void disconnect(String)): new ClientInfo(resetState#1).sRealName
    //#output(void disconnect(String)): new HashMap(ClientInfo#3) num objects
    //#output(void disconnect(String)): new Hashtable(ClientInfo#1) num objects
    //#output(void disconnect(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void disconnect(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void disconnect(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void disconnect(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void disconnect(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void disconnect(String)): new IRCStringConverter(updateCharArrays#1) num objects
    //#output(void disconnect(String)): new IRCStringConverter(updateCharArrays#1).__Tag
    //#output(void disconnect(String)): new IRCStringConverter(updateCharArrays#1).limit
    //#output(void disconnect(String)): new IRCStringConverter(updateCharArrays#1).lowercase
    //#output(void disconnect(String)): new IRCStringConverter(updateCharArrays#1).uppercase
    //#output(void disconnect(String)): new LinkedList(ClientInfo#2) num objects
    //#output(void disconnect(String)): new char[](IRCStringConverter#1) num objects
    //#output(void disconnect(String)): new char[](IRCStringConverter#1).length
    //#output(void disconnect(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void disconnect(String)): new char[](IRCStringConverter#2) num objects
    //#output(void disconnect(String)): new char[](IRCStringConverter#2).length
    //#output(void disconnect(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void disconnect(String)): this.cMyself
    //#output(void disconnect(String)): this.cMyself.myAwayReason
    //#output(void disconnect(String)): this.currentSocketState
    //#output(void disconnect(String)): this.got001
    //#output(void disconnect(String)): this.lastLine
    //#output(void disconnect(String)): this.nNextKeyCMBool
    //#output(void disconnect(String)): this.nNextKeyPrefix
    //#output(void disconnect(String)): this.nNextKeyUser
    //#output(void disconnect(String)): this.pingTimer
    //#output(void disconnect(String)): this.post005
    //#output(void disconnect(String)): this.sNetworkName
    //#output(void disconnect(String)): this.sServerName
    //#output(void disconnect(String)): this.stringConverter
    //#output(void disconnect(String)): this.triedAlt
    //#new obj(void disconnect(String)): java.lang.String:substring(...)
    //#new obj(void disconnect(String)): new ClientInfo(resetState#1)
    //#new obj(void disconnect(String)): new HashMap(ClientInfo#3)
    //#new obj(void disconnect(String)): new Hashtable(ClientInfo#1)
    //#new obj(void disconnect(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void disconnect(String)): new IRCStringConverter(updateCharArrays#1)
    //#new obj(void disconnect(String)): new LinkedList(ClientInfo#2)
    //#new obj(void disconnect(String)): new char[](IRCStringConverter#1)
    //#new obj(void disconnect(String)): new char[](IRCStringConverter#2)
    //#pre[3] (void disconnect(String)): init'ed(this.currentSocketState)
    //#pre[5] (void disconnect(String)): init'ed(this.pingTimer)
    //#pre[11] (void disconnect(String)): this.h005Info != null
    //#pre[12] (void disconnect(String)): this.hChanModesBool != null
    //#pre[13] (void disconnect(String)): this.hChanModesOther != null
    //#pre[14] (void disconnect(String)): this.hChanPrefix != null
    //#pre[15] (void disconnect(String)): this.hChannelList != null
    //#pre[17] (void disconnect(String)): this.hClientList != null
    //#pre[18] (void disconnect(String)): this.hPrefixMap != null
    //#pre[19] (void disconnect(String)): this.hPrefixModes != null
    //#pre[20] (void disconnect(String)): this.hUserModes != null
    //#pre[24] (void disconnect(String)): this.pingTimerSem != null
    //#pre[1] (void disconnect(String)): (soft) this.cMyself != null
    //#pre[4] (void disconnect(String)): (soft) init'ed(this.got001)
    //#pre[6] (void disconnect(String)): (soft) init'ed(this.stringConverter)
    //#pre[7] (void disconnect(String)): (soft) sReason != null
    //#pre[10] (void disconnect(String)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[21] (void disconnect(String)): (soft) this.myCallbackManager != null
    //#pre[22] (void disconnect(String)): (soft) this.myCallbackManager.callbackHash != null
    //#pre[23] (void disconnect(String)): (soft) init'ed(this.out)
    //#pre[25] (void disconnect(String)): (soft) init'ed(this.socket)
    //#post(void disconnect(String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void disconnect(String)): this.cMyself in Addr_Set{&new ClientInfo(resetState#1),&new ClientInfo(resetState#1)}
    //#post(void disconnect(String)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void disconnect(String)): this.currentSocketState == &com.dmdirc.parser.irc.SocketState__static_init.new SocketState(SocketState__static_init#2)
    //#post(void disconnect(String)): this.got001 == 0
    //#post(void disconnect(String)): this.lastLine == &""
    //#post(void disconnect(String)): this.nNextKeyCMBool == 1
    //#post(void disconnect(String)): this.nNextKeyPrefix == 1
    //#post(void disconnect(String)): this.nNextKeyUser == 1
    //#post(void disconnect(String)): this.pingTimer == null
    //#post(void disconnect(String)): this.post005 == 0
    //#post(void disconnect(String)): this.sNetworkName == &""
    //#post(void disconnect(String)): this.sServerName == &""
    //#post(void disconnect(String)): this.stringConverter in Addr_Set{&new IRCStringConverter(updateCharArrays#1),&new IRCStringConverter(updateCharArrays#1)}
    //#post(void disconnect(String)): this.triedAlt == 0
    //#post(void disconnect(String)): new ClientInfo(resetState#1) num objects <= 1
    //#post(void disconnect(String)): new ClientInfo(resetState#1) num objects == 0
    //#post(void disconnect(String)): new HashMap(ClientInfo#3) num objects == 0
    //#post(void disconnect(String)): new Hashtable(ClientInfo#1) num objects == 0
    //#post(void disconnect(String)): new IRCStringConverter(updateCharArrays#1) num objects == 0
    //#post(void disconnect(String)): new LinkedList(ClientInfo#2) num objects == 0
    //#post(void disconnect(String)): new char[](IRCStringConverter#1) num objects == 0
    //#post(void disconnect(String)): new char[](IRCStringConverter#2) num objects == 0
    //#post(void disconnect(String)): init'ed(new ClientInfo(resetState#1).__Tag)
    //#post(void disconnect(String)): init'ed(new ClientInfo(resetState#1).bIsFake)
    //#post(void disconnect(String)): init'ed(new ClientInfo(resetState#1).lModeQueue)
    //#post(void disconnect(String)): init'ed(new ClientInfo(resetState#1).myAwayReason)
    //#post(void disconnect(String)): init'ed(new ClientInfo(resetState#1).myChannelClientInfos)
    //#post(void disconnect(String)): init'ed(new ClientInfo(resetState#1).myMap)
    //#post(void disconnect(String)): init'ed(new ClientInfo(resetState#1).myParser)
    //#post(void disconnect(String)): possibly_updated(new ClientInfo(resetState#1).sHost)
    //#post(void disconnect(String)): init'ed(new ClientInfo(resetState#1).sHost)
    //#post(void disconnect(String)): possibly_updated(new ClientInfo(resetState#1).sIdent)
    //#post(void disconnect(String)): init'ed(new ClientInfo(resetState#1).sIdent)
    //#post(void disconnect(String)): possibly_updated(new ClientInfo(resetState#1).sNickname)
    //#post(void disconnect(String)): init'ed(new ClientInfo(resetState#1).sNickname)
    //#post(void disconnect(String)): init'ed(new ClientInfo(resetState#1).sRealName)
    //#post(void disconnect(String)): new HashMap(ClientInfo#3) num objects <= 1
    //#post(void disconnect(String)): new Hashtable(ClientInfo#1) num objects <= 1
    //#post(void disconnect(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void disconnect(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void disconnect(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void disconnect(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void disconnect(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void disconnect(String)): new IRCStringConverter(updateCharArrays#1) num objects <= 1
    //#post(void disconnect(String)): init'ed(new IRCStringConverter(updateCharArrays#1).__Tag)
    //#post(void disconnect(String)): init'ed(new IRCStringConverter(updateCharArrays#1).limit)
    //#post(void disconnect(String)): init'ed(new IRCStringConverter(updateCharArrays#1).lowercase)
    //#post(void disconnect(String)): init'ed(new IRCStringConverter(updateCharArrays#1).uppercase)
    //#post(void disconnect(String)): new LinkedList(ClientInfo#2) num objects <= 1
    //#post(void disconnect(String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void disconnect(String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void disconnect(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void disconnect(String)): init'ed(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void disconnect(String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void disconnect(String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void disconnect(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#post(void disconnect(String)): init'ed(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.util.concurrent.Semaphore:acquireUninterruptibly
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.util.concurrent.Semaphore:release
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.util.Map:clear
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void disconnect(String)): Effects-of-calling:doSendString
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void disconnect(String)): Effects-of-calling:sendString
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void disconnect(String)): Effects-of-calling:call
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void disconnect(String)): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo
    //#unanalyzed(void disconnect(String)): Effects-of-calling:setFake
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void disconnect(String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void disconnect(String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.util.Hashtable
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void disconnect(String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#test_vector(void disconnect(String)): this.got001: {0}, {1}
		try {
			if (socket != null) { socket.close(); }
		} catch (IOException e) {
    //#IRCParser.java:1677: Warning: unused assignment
    //#    Unused assignment into e
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void disconnect(String)
			/* Do Nothing */
		} finally {
			if (currentSocketState != SocketState.CLOSED) {
				currentSocketState = SocketState.CLOSED;
				callSocketClosed();
			}
			resetState();
		}
	}
    //#IRCParser.java:1686: end of method: void com.dmdirc.parser.irc.IRCParser.disconnect(String)

	/**
	 * Check if a channel name is valid.
	 *
	 * @param sChannelName Channel name to test
	 * @return true if name is valid on the current connection, false otherwise.
	 *         - Before channel prefixes are known (005/noMOTD/MOTDEnd), this checks
	 *           that the first character is either #, &amp;, ! or +
	 *         - Assumes that any channel that is already known is valid, even if
	 *           005 disagrees.
	 */
	public boolean isValidChannelName(final String sChannelName) {
		// Check sChannelName is not empty or null
		if (sChannelName == null || sChannelName.isEmpty()) { return false; }
    //#IRCParser.java:1700: method: bool com.dmdirc.parser.irc.IRCParser.isValidChannelName(String)
    //#input(bool isValidChannelName(String)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(bool isValidChannelName(String)): __Descendant_Table[others]
    //#input(bool isValidChannelName(String)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(bool isValidChannelName(String)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(bool isValidChannelName(String)): __Dispatch_Table.getMyNickname()Ljava/lang/String;
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.equalsIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(bool isValidChannelName(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(bool isValidChannelName(String)): sChannelName
    //#input(bool isValidChannelName(String)): this
    //#input(bool isValidChannelName(String)): this.__Tag
    //#input(bool isValidChannelName(String)): this.cMyself
    //#input(bool isValidChannelName(String)): this.cMyself.bIsFake
    //#input(bool isValidChannelName(String)): this.cMyself.sNickname
    //#input(bool isValidChannelName(String)): this.hChanPrefix
    //#input(bool isValidChannelName(String)): this.hChannelList
    //#input(bool isValidChannelName(String)): this.sThinkNickname
    //#input(bool isValidChannelName(String)): this.stringConverter
    //#input(bool isValidChannelName(String)): this.stringConverter.__Tag
    //#input(bool isValidChannelName(String)): this.stringConverter.lowercase
    //#input(bool isValidChannelName(String)): this.stringConverter.lowercase.length
    //#input(bool isValidChannelName(String)): this.stringConverter.lowercase[0..65_535]
    //#output(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(bool isValidChannelName(String)): new char[](IRCStringConverter#1) num objects
    //#output(bool isValidChannelName(String)): new char[](IRCStringConverter#1).length
    //#output(bool isValidChannelName(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(bool isValidChannelName(String)): new char[](IRCStringConverter#2) num objects
    //#output(bool isValidChannelName(String)): new char[](IRCStringConverter#2).length
    //#output(bool isValidChannelName(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(bool isValidChannelName(String)): return_value
    //#output(bool isValidChannelName(String)): this.stringConverter
    //#new obj(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(bool isValidChannelName(String)): new char[](IRCStringConverter#1)
    //#new obj(bool isValidChannelName(String)): new char[](IRCStringConverter#2)
    //#pre[1] (bool isValidChannelName(String)): (soft) init'ed(this.stringConverter)
    //#pre[4] (bool isValidChannelName(String)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[5] (bool isValidChannelName(String)): (soft) this.cMyself != null
    //#pre[6] (bool isValidChannelName(String)): (soft) init'ed(this.cMyself.bIsFake)
    //#pre[7] (bool isValidChannelName(String)): (soft) init'ed(this.cMyself.sNickname)
    //#pre[8] (bool isValidChannelName(String)): (soft) this.hChanPrefix != null
    //#pre[9] (bool isValidChannelName(String)): (soft) this.hChannelList != null
    //#pre[11] (bool isValidChannelName(String)): (soft) init'ed(this.sThinkNickname)
    //#presumption(bool isValidChannelName(String)): getIRCStringConverter(...).__Tag@1702 == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(bool isValidChannelName(String)): getIRCStringConverter(...).lowercase.length@1702 >= 1
    //#presumption(bool isValidChannelName(String)): getIRCStringConverter(...).lowercase@1702 != null
    //#post(bool isValidChannelName(String)): init'ed(return_value)
    //#post(bool isValidChannelName(String)): init'ed(this.stringConverter)
    //#post(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1) num objects == 0
    //#post(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(bool isValidChannelName(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(bool isValidChannelName(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(bool isValidChannelName(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(bool isValidChannelName(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(bool isValidChannelName(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(bool isValidChannelName(String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(bool isValidChannelName(String)): new char[](IRCStringConverter#1) num objects == 0
    //#post(bool isValidChannelName(String)): new char[](IRCStringConverter#1).length == 127
    //#post(bool isValidChannelName(String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(bool isValidChannelName(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(bool isValidChannelName(String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(bool isValidChannelName(String)): new char[](IRCStringConverter#2) num objects == 0
    //#post(bool isValidChannelName(String)): new char[](IRCStringConverter#2).length == 127
    //#post(bool isValidChannelName(String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(bool isValidChannelName(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:isFake
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:getNickname
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(bool isValidChannelName(String)): Effects-of-calling:java.lang.String
    //#test_vector(bool isValidChannelName(String)): sChannelName: Addr_Set{null}, Inverse{null}
    //#test_vector(bool isValidChannelName(String)): java.lang.String:isEmpty(...)@1700: {0}, {1}
    //#test_vector(bool isValidChannelName(String)): java.util.Map:isEmpty(...)@1706: {0}, {1}
		// Check its not ourself (PM recieved before 005)
		if (getIRCStringConverter().equalsIgnoreCase(getMyNickname(), sChannelName)) { return false; }
		// Check if we are already on this channel
		if (getChannelInfo(sChannelName) != null) { return true; }
		// Check if we know of any valid chan prefixes
		if (hChanPrefix.isEmpty()) {
			// We don't. Lets check against RFC2811-Specified channel types
			final char first = sChannelName.charAt(0);
			return first == '#' || first == '&' || first == '!' || first == '+';
		}
		// Otherwise return true if:
		// Channel equals "0"
		// first character of the channel name is a valid channel prefix.
		return hChanPrefix.containsKey(sChannelName.charAt(0)) || sChannelName.equals("0");
    //#IRCParser.java:1714: end of method: bool com.dmdirc.parser.irc.IRCParser.isValidChannelName(String)
	}

	/**
	 * Check if a given chanmode is user settable.
	 *
	 * @param mode Mode to test
	 * @return true if mode is settable by users, false if servers only
	 */
	public boolean isUserSettable(final Character mode) {
		String validmodes;
		if (h005Info.containsKey("USERCHANMODES")) {
    //#IRCParser.java:1725: method: bool com.dmdirc.parser.irc.IRCParser.isUserSettable(Character)
    //#input(bool isUserSettable(Character)): ".*"._tainted
    //#input(bool isUserSettable(Character)): mode
    //#input(bool isUserSettable(Character)): mode._tainted
    //#input(bool isUserSettable(Character)): this
    //#input(bool isUserSettable(Character)): this.h005Info
    //#output(bool isUserSettable(Character)): return_value
    //#pre[4] (bool isUserSettable(Character)): this.h005Info != null
    //#presumption(bool isUserSettable(Character)): java.util.Map:get(...)@1726 != null
    //#post(bool isUserSettable(Character)): init'ed(return_value)
    //#test_vector(bool isUserSettable(Character)): java.util.Map:containsKey(...)@1725: {0}, {1}
			validmodes = h005Info.get("USERCHANMODES");
		} else {
			validmodes = "bklimnpstrc";
		}
		return validmodes.matches(".*" + mode + ".*");
    //#IRCParser.java:1730: end of method: bool com.dmdirc.parser.irc.IRCParser.isUserSettable(Character)
	}

	/**
	 * Get the 005 info.
	 *
	 * @return 005Info hashtable.
	 */
	public Map<String, String> get005() { return h005Info; }
    //#IRCParser.java:1738: method: Map com.dmdirc.parser.irc.IRCParser.get005()
    //#input(Map get005()): this
    //#input(Map get005()): this.h005Info
    //#output(Map get005()): return_value
    //#post(Map get005()): return_value == this.h005Info
    //#post(Map get005()): init'ed(return_value)
    //#IRCParser.java:1738: end of method: Map com.dmdirc.parser.irc.IRCParser.get005()

	/**
	 * Get the name of the ircd.
	 *
	 * @param getType if this is false the string from 004 is returned. Else a guess of the type (ircu, hybrid, ircnet)
	 * @return IRCD Version or Type
	 */
	public String getIRCD(final boolean getType) {
		if (h005Info.containsKey("004IRCD")) {
    //#IRCParser.java:1747: method: String com.dmdirc.parser.irc.IRCParser.getIRCD(bool)
    //#input(String getIRCD(bool)): getType
    //#input(String getIRCD(bool)): this
    //#input(String getIRCD(bool)): this.h005Info
    //#input(String getIRCD(bool)): this.sNetworkName
    //#output(String getIRCD(bool)): return_value
    //#pre[3] (String getIRCD(bool)): this.h005Info != null
    //#pre[4] (String getIRCD(bool)): (soft) this.sNetworkName != null
    //#presumption(String getIRCD(bool)): java.util.Map:get(...)@1748 != null
    //#presumption(String getIRCD(bool)): java.util.Map:get(...)@1784 != null
    //#post(String getIRCD(bool)): return_value != null
    //#test_vector(String getIRCD(bool)): getType: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:equalsIgnoreCase(...)@1781: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:equalsIgnoreCase(...)@1782: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:equalsIgnoreCase(...)@1783: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1752: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1753: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1754: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1755: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1756: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1757: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1758: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1759: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1760: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1761: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1762: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1763: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1764: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1765: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1766: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1767: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1768: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1769: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1770: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1771: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1772: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1773: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1774: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1775: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1776: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1777: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1778: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.lang.String:matches(...)@1784: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.util.Map:containsKey(...)@1747: {0}, {1}
    //#test_vector(String getIRCD(bool)): java.util.Map:containsKey(...)@1784: {0}, {1}
			final String version = h005Info.get("004IRCD");
			if (getType) {
				// This ilst is vaugly based on http://searchirc.com/ircd-versions,
				// but keeping groups of ircd's together (ie hybrid-based, ircu-based)
				if (version.matches("(?i).*unreal.*")) { return "unreal"; }
				else if (version.matches("(?i).*bahamut.*")) { return "bahamut"; }
				else if (version.matches("(?i).*nefarious.*")) { return "nefarious"; }
				else if (version.matches("(?i).*asuka.*")) { return "asuka"; }
				else if (version.matches("(?i).*snircd.*")) { return "snircd"; }
				else if (version.matches("(?i).*beware.*")) { return "bircd"; }
				else if (version.matches("(?i).*u2\\.[0-9]+\\.H\\..*")) { return "irchispano"; }
				else if (version.matches("(?i).*u2\\.[0-9]+\\..*")) { return "ircu"; }
				else if (version.matches("(?i).*ircu.*")) { return "ircu"; }
				else if (version.matches("(?i).*plexus.*")) { return "plexus"; }
				else if (version.matches("(?i).*hybrid.*oftc.*")) { return "oftc-hybrid"; }
				else if (version.matches("(?i).*ircd.hybrid.*")) { return "hybrid7"; }
				else if (version.matches("(?i).*hybrid.*")) { return "hybrid"; }
				else if (version.matches("(?i).*charybdis.*")) { return "charybdis"; }
				else if (version.matches("(?i).*inspircd.*")) { return "inspircd"; }
				else if (version.matches("(?i).*ultimateircd.*")) { return "ultimateircd"; }
				else if (version.matches("(?i).*critenircd.*")) { return "critenircd"; }
				else if (version.matches("(?i).*fqircd.*")) { return "fqircd"; }
				else if (version.matches("(?i).*conferenceroom.*")) { return "conferenceroom"; }
				else if (version.matches("(?i).*hyperion.*")) { return "hyperion"; }
				else if (version.matches("(?i).*dancer.*")) { return "dancer"; }
				else if (version.matches("(?i).*austhex.*")) { return "austhex"; }
				else if (version.matches("(?i).*austirc.*")) { return "austirc"; }
				else if (version.matches("(?i).*ratbox.*")) { return "ratbox"; }
				else if (version.matches("(?i).*euircd.*")) { return "euircd"; }
				else if (version.matches("(?i).*weircd.*")) { return "weircd"; }
				else if (version.matches("(?i).*swiftirc.*")) { return "swiftirc"; }
				else {
					// Stupid networks/ircds go here...
					if (sNetworkName.equalsIgnoreCase("ircnet")) { return "ircnet"; }
					else if (sNetworkName.equalsIgnoreCase("starchat")) { return "starchat"; }
					else if (sNetworkName.equalsIgnoreCase("bitlbee")) { return "bitlbee"; }
					else if (h005Info.containsKey("003IRCD") && h005Info.get("003IRCD").matches("(?i).*bitlbee.*")) { return "bitlbee"; } // Older bitlbee
					else { return "generic"; }
				}
			} else {
				return version;
			}
		} else {
			if (getType) { return "generic"; }
			else { return ""; }
    //#IRCParser.java:1792: end of method: String com.dmdirc.parser.irc.IRCParser.getIRCD(bool)
		}
	}


	/**
	 * Get the time used for the ping Timer.
	 *
	 * @return current time used.
	 * @see setPingCountDownLength
	 */
	public long getPingTimerLength() { return pingTimerLength; }
    //#IRCParser.java:1803: method: long com.dmdirc.parser.irc.IRCParser.getPingTimerLength()
    //#input(long getPingTimerLength()): this
    //#input(long getPingTimerLength()): this.pingTimerLength
    //#output(long getPingTimerLength()): return_value
    //#pre[2] (long getPingTimerLength()): init'ed(this.pingTimerLength)
    //#post(long getPingTimerLength()): return_value == this.pingTimerLength
    //#post(long getPingTimerLength()): init'ed(return_value)
    //#IRCParser.java:1803: end of method: long com.dmdirc.parser.irc.IRCParser.getPingTimerLength()

	/**
	 * Set the time used for the ping Timer.
	 * This will also reset the pingTimer.
	 *
	 * @param newValue New value to use.
	 * @see setPingCountDownLength
	 */
	public void setPingTimerLength(final long newValue) {
		pingTimerLength = newValue;
    //#IRCParser.java:1813: method: void com.dmdirc.parser.irc.IRCParser.setPingTimerLength(long)
    //#input(void setPingTimerLength(long)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void setPingTimerLength(long)): __Descendant_Table[others]
    //#input(void setPingTimerLength(long)): __Dispatch_Table.startPingTimer()V
    //#input(void setPingTimerLength(long)): newValue
    //#input(void setPingTimerLength(long)): this
    //#input(void setPingTimerLength(long)): this.__Tag
    //#input(void setPingTimerLength(long)): this.pingNeeded
    //#input(void setPingTimerLength(long)): this.pingTimer
    //#input(void setPingTimerLength(long)): this.pingTimerSem
    //#output(void setPingTimerLength(long)): new Timer(startPingTimer#1) num objects
    //#output(void setPingTimerLength(long)): this.pingCountDown
    //#output(void setPingTimerLength(long)): this.pingTimer
    //#output(void setPingTimerLength(long)): this.pingTimerLength
    //#new obj(void setPingTimerLength(long)): new Timer(startPingTimer#1)
    //#pre[2] (void setPingTimerLength(long)): init'ed(this.pingTimer)
    //#pre[4] (void setPingTimerLength(long)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[5] (void setPingTimerLength(long)): this.pingNeeded != null
    //#pre[6] (void setPingTimerLength(long)): this.pingTimerSem != null
    //#post(void setPingTimerLength(long)): this.pingCountDown == 1
    //#post(void setPingTimerLength(long)): new Timer(startPingTimer#1) num objects == 1
    //#post(void setPingTimerLength(long)): this.pingTimer == &new Timer(startPingTimer#1)
    //#post(void setPingTimerLength(long)): this.pingTimerLength == newValue
    //#post(void setPingTimerLength(long)): init'ed(this.pingTimerLength)
    //#unanalyzed(void setPingTimerLength(long)): Effects-of-calling:java.util.concurrent.atomic.AtomicBoolean:set
    //#unanalyzed(void setPingTimerLength(long)): Effects-of-calling:java.util.concurrent.Semaphore:acquireUninterruptibly
    //#unanalyzed(void setPingTimerLength(long)): Effects-of-calling:java.util.Timer:cancel
    //#unanalyzed(void setPingTimerLength(long)): Effects-of-calling:java.util.Timer
    //#unanalyzed(void setPingTimerLength(long)): Effects-of-calling:java.util.TimerTask
    //#unanalyzed(void setPingTimerLength(long)): Effects-of-calling:java.util.Timer:schedule
    //#unanalyzed(void setPingTimerLength(long)): Effects-of-calling:java.util.concurrent.Semaphore:release
		startPingTimer();
	}
    //#IRCParser.java:1815: end of method: void com.dmdirc.parser.irc.IRCParser.setPingTimerLength(long)

	/**
	 * Get the time used for the pingCountdown.
	 *
	 * @return current time used.
	 * @see setPingCountDownLength
	 */
	public int getPingCountDownLength() { return pingCountDownLength; }
    //#IRCParser.java:1823: method: int com.dmdirc.parser.irc.IRCParser.getPingCountDownLength()
    //#input(int getPingCountDownLength()): this
    //#input(int getPingCountDownLength()): this.pingCountDownLength
    //#output(int getPingCountDownLength()): return_value
    //#pre[2] (int getPingCountDownLength()): init'ed(this.pingCountDownLength)
    //#post(int getPingCountDownLength()): return_value == this.pingCountDownLength
    //#post(int getPingCountDownLength()): init'ed(return_value)
    //#IRCParser.java:1823: end of method: int com.dmdirc.parser.irc.IRCParser.getPingCountDownLength()

	/**
	 * Set the time used for the ping countdown.
	 * The pingTimer fires every pingTimerLength/1000 seconds, whenever a line of data
	 * is received, the "waiting for ping" flag is set to false, if the line is
	 * a "PONG", then onPingSuccess is also called.
	 *
	 * When waiting for a ping reply, onPingFailed() is called every time the
	 * timer is fired.
	 *
	 * When not waiting for a ping reply, the pingCountDown is decreased by 1
	 * every time the timer fires, when it reaches 0 is is reset to
	 * pingCountDownLength and a PING is sent to the server.
	 *
	 * To ping the server after 30 seconds of inactivity you could use:
	 * pingTimerLength = 5000, pingCountDown = 6
	 * or
	 * pingTimerLength = 10000, pingCountDown = 3
	 *
	 * @param newValue New value to use.
	 * @see pingCountDown
	 * @see pingTimerLength
	 * @see pingTimerTask
	 */
	public void setPingCountDownLength(final int newValue) {
		pingCountDownLength = newValue;
    //#IRCParser.java:1849: method: void com.dmdirc.parser.irc.IRCParser.setPingCountDownLength(int)
    //#input(void setPingCountDownLength(int)): newValue
    //#input(void setPingCountDownLength(int)): this
    //#output(void setPingCountDownLength(int)): this.pingCountDownLength
    //#post(void setPingCountDownLength(int)): this.pingCountDownLength == newValue
    //#post(void setPingCountDownLength(int)): init'ed(this.pingCountDownLength)
	}
    //#IRCParser.java:1850: end of method: void com.dmdirc.parser.irc.IRCParser.setPingCountDownLength(int)

	/**
	 * Start the pingTimer.
	 */
	protected void startPingTimer() {
        pingTimerSem.acquireUninterruptibly();
    //#IRCParser.java:1856: method: void com.dmdirc.parser.irc.IRCParser.startPingTimer()
    //#input(void startPingTimer()): this
    //#input(void startPingTimer()): this.pingNeeded
    //#input(void startPingTimer()): this.pingTimer
    //#input(void startPingTimer()): this.pingTimerLength
    //#input(void startPingTimer()): this.pingTimerSem
    //#output(void startPingTimer()): new Timer(startPingTimer#1) num objects
    //#output(void startPingTimer()): this.pingCountDown
    //#output(void startPingTimer()): this.pingTimer
    //#new obj(void startPingTimer()): new Timer(startPingTimer#1)
    //#pre[1] (void startPingTimer()): init'ed(this.pingTimer)
    //#pre[3] (void startPingTimer()): this.pingNeeded != null
    //#pre[4] (void startPingTimer()): init'ed(this.pingTimerLength)
    //#pre[5] (void startPingTimer()): this.pingTimerSem != null
    //#post(void startPingTimer()): this.pingCountDown == 1
    //#post(void startPingTimer()): new Timer(startPingTimer#1) num objects == 1
    //#post(void startPingTimer()): this.pingTimer == &new Timer(startPingTimer#1)
    //#unanalyzed(void startPingTimer()): Effects-of-calling:java.util.concurrent.atomic.AtomicBoolean:set
    //#unanalyzed(void startPingTimer()): Effects-of-calling:java.util.TimerTask
    //#test_vector(void startPingTimer()): this.pingTimer: Addr_Set{null}, Inverse{null}

		setPingNeeded(false);
		if (pingTimer != null) { pingTimer.cancel(); }
		pingTimer = new Timer("IRCParser pingTimer");
		pingTimer.schedule(new PingTimer(this, pingTimer), 0, pingTimerLength);
		pingCountDown = 1;

        pingTimerSem.release();
	}
    //#IRCParser.java:1865: end of method: void com.dmdirc.parser.irc.IRCParser.startPingTimer()

	/**
	 * This is called when the ping Timer has been executed.
	 * As the timer is restarted on every incomming message, this will only be
	 * called when there has been no incomming line for 10 seconds.
	 *
	 * @param timer The timer that called this.
	 */
	protected void pingTimerTask(final Timer timer) {
		if (getPingNeeded()) {
    //#IRCParser.java:1875: method: void com.dmdirc.parser.irc.IRCParser.pingTimerTask(Timer)
    //#input(void pingTimerTask(Timer)): " for mode "._tainted
    //#input(void pingTimerTask(Timer)): "Callback not found: "._tainted
    //#input(void pingTimerTask(Timer)): "Intercepted mode request for "._tainted
    //#input(void pingTimerTask(Timer)): "OnDataOut"._tainted
    //#input(void pingTimerTask(Timer)): "OnDebugInfo"._tainted
    //#input(void pingTimerTask(Timer)): "OnPingFailed"._tainted
    //#input(void pingTimerTask(Timer)): "OnPingSent"._tainted
    //#input(void pingTimerTask(Timer)): "PING "._tainted
    //#input(void pingTimerTask(Timer)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void pingTimerTask(Timer)): __Descendant_Table[others]
    //#input(void pingTimerTask(Timer)): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void pingTimerTask(Timer)): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void pingTimerTask(Timer)): __Dispatch_Table.callPingFailed()Z
    //#input(void pingTimerTask(Timer)): __Dispatch_Table.callPingSent()Z
    //#input(void pingTimerTask(Timer)): __Dispatch_Table.disconnect(Ljava/lang/String;)V
    //#input(void pingTimerTask(Timer)): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void pingTimerTask(Timer)): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void pingTimerTask(Timer)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void pingTimerTask(Timer)): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void pingTimerTask(Timer)): __Dispatch_Table.sendLine(Ljava/lang/String;)V
    //#input(void pingTimerTask(Timer)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void pingTimerTask(Timer)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void pingTimerTask(Timer)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void pingTimerTask(Timer)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void pingTimerTask(Timer)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void pingTimerTask(Timer)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void pingTimerTask(Timer)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void pingTimerTask(Timer)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void pingTimerTask(Timer)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void pingTimerTask(Timer)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void pingTimerTask(Timer)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void pingTimerTask(Timer)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void pingTimerTask(Timer)): this
    //#input(void pingTimerTask(Timer)): this.__Tag
    //#input(void pingTimerTask(Timer)): this.cMyself
    //#input(void pingTimerTask(Timer)): this.currentSocketState
    //#input(void pingTimerTask(Timer)): this.hChanModesOther
    //#input(void pingTimerTask(Timer)): this.hChannelList
    //#input(void pingTimerTask(Timer)): this.lastPingValue._tainted
    //#input(void pingTimerTask(Timer)): this.myCallbackManager
    //#input(void pingTimerTask(Timer)): this.myCallbackManager.callbackHash
    //#input(void pingTimerTask(Timer)): this.out
    //#input(void pingTimerTask(Timer)): this.pingCountDown
    //#input(void pingTimerTask(Timer)): this.pingCountDownLength
    //#input(void pingTimerTask(Timer)): this.pingNeeded
    //#input(void pingTimerTask(Timer)): this.pingTimer
    //#input(void pingTimerTask(Timer)): this.pingTimerSem
    //#input(void pingTimerTask(Timer)): this.stringConverter
    //#input(void pingTimerTask(Timer)): this.stringConverter.__Tag
    //#input(void pingTimerTask(Timer)): this.stringConverter.lowercase
    //#input(void pingTimerTask(Timer)): this.stringConverter.lowercase.length
    //#input(void pingTimerTask(Timer)): this.stringConverter.lowercase[0..65_535]
    //#input(void pingTimerTask(Timer)): timer
    //#output(void pingTimerTask(Timer)): java.lang.String:substring(...)._tainted
    //#output(void pingTimerTask(Timer)): java.lang.String:valueOf(...)._tainted
    //#output(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void pingTimerTask(Timer)): new IRCStringConverter(updateCharArrays#1) num objects
    //#output(void pingTimerTask(Timer)): new IRCStringConverter(updateCharArrays#1).__Tag
    //#output(void pingTimerTask(Timer)): new IRCStringConverter(updateCharArrays#1).limit
    //#output(void pingTimerTask(Timer)): new IRCStringConverter(updateCharArrays#1).lowercase
    //#output(void pingTimerTask(Timer)): new IRCStringConverter(updateCharArrays#1).uppercase
    //#output(void pingTimerTask(Timer)): new char[](IRCStringConverter#1) num objects
    //#output(void pingTimerTask(Timer)): new char[](IRCStringConverter#1).length
    //#output(void pingTimerTask(Timer)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void pingTimerTask(Timer)): new char[](IRCStringConverter#2) num objects
    //#output(void pingTimerTask(Timer)): new char[](IRCStringConverter#2).length
    //#output(void pingTimerTask(Timer)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void pingTimerTask(Timer)): this.cMyself
    //#output(void pingTimerTask(Timer)): this.cMyself.myAwayReason
    //#output(void pingTimerTask(Timer)): this.currentSocketState
    //#output(void pingTimerTask(Timer)): this.got001
    //#output(void pingTimerTask(Timer)): this.lastLine
    //#output(void pingTimerTask(Timer)): this.lastPingValue
    //#output(void pingTimerTask(Timer)): this.nNextKeyCMBool
    //#output(void pingTimerTask(Timer)): this.nNextKeyPrefix
    //#output(void pingTimerTask(Timer)): this.nNextKeyUser
    //#output(void pingTimerTask(Timer)): this.pingCountDown
    //#output(void pingTimerTask(Timer)): this.pingTime
    //#output(void pingTimerTask(Timer)): this.pingTimer
    //#output(void pingTimerTask(Timer)): this.post005
    //#output(void pingTimerTask(Timer)): this.sNetworkName
    //#output(void pingTimerTask(Timer)): this.sServerName
    //#output(void pingTimerTask(Timer)): this.stringConverter
    //#output(void pingTimerTask(Timer)): this.triedAlt
    //#new obj(void pingTimerTask(Timer)): java.lang.String:substring(...)
    //#new obj(void pingTimerTask(Timer)): java.lang.String:valueOf(...)
    //#new obj(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void pingTimerTask(Timer)): new IRCStringConverter(updateCharArrays#1)
    //#new obj(void pingTimerTask(Timer)): new char[](IRCStringConverter#1)
    //#new obj(void pingTimerTask(Timer)): new char[](IRCStringConverter#2)
    //#pre[34] (void pingTimerTask(Timer)): this.pingNeeded != null
    //#pre[1] (void pingTimerTask(Timer)): (soft) this.cMyself != null
    //#pre[3] (void pingTimerTask(Timer)): (soft) init'ed(this.currentSocketState)
    //#pre[10] (void pingTimerTask(Timer)): (soft) this.pingCountDown >= -2_147_483_647
    //#pre[12] (void pingTimerTask(Timer)): (soft) init'ed(this.pingTimer)
    //#pre[16] (void pingTimerTask(Timer)): (soft) init'ed(this.stringConverter)
    //#pre[19] (void pingTimerTask(Timer)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[22] (void pingTimerTask(Timer)): (soft) this.hChanModesOther != null
    //#pre[24] (void pingTimerTask(Timer)): (soft) this.hChannelList != null
    //#pre[30] (void pingTimerTask(Timer)): (soft) this.myCallbackManager != null
    //#pre[31] (void pingTimerTask(Timer)): (soft) this.myCallbackManager.callbackHash != null
    //#pre[32] (void pingTimerTask(Timer)): (soft) init'ed(this.out)
    //#pre[33] (void pingTimerTask(Timer)): (soft) init'ed(this.pingCountDownLength)
    //#pre[35] (void pingTimerTask(Timer)): (soft) this.pingTimerSem != null
    //#post(void pingTimerTask(Timer)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void pingTimerTask(Timer)): java.lang.String:valueOf(...)._tainted == 0
    //#post(void pingTimerTask(Timer)): this.cMyself == old this.cMyself
    //#post(void pingTimerTask(Timer)): this.cMyself != null
    //#post(void pingTimerTask(Timer)): possibly_updated(this.cMyself.myAwayReason)
    //#post(void pingTimerTask(Timer)): this.currentSocketState == old this.currentSocketState
    //#post(void pingTimerTask(Timer)): init'ed(this.currentSocketState)
    //#post(void pingTimerTask(Timer)): this.got001 == old this.got001
    //#post(void pingTimerTask(Timer)): this.lastLine == old this.lastLine
    //#post(void pingTimerTask(Timer)): this.lastPingValue == One-of{old this.lastPingValue, &java.lang.String:valueOf(...)}
    //#post(void pingTimerTask(Timer)): this.nNextKeyCMBool == old this.nNextKeyCMBool
    //#post(void pingTimerTask(Timer)): this.nNextKeyPrefix == old this.nNextKeyPrefix
    //#post(void pingTimerTask(Timer)): this.nNextKeyUser == old this.nNextKeyUser
    //#post(void pingTimerTask(Timer)): this.pingCountDown == One-of{old this.pingCountDown, old this.pingCountDown - 1, this.pingCountDownLength}
    //#post(void pingTimerTask(Timer)): init'ed(this.pingCountDown)
    //#post(void pingTimerTask(Timer)): possibly_updated(this.pingTime)
    //#post(void pingTimerTask(Timer)): this.pingTimer == old this.pingTimer
    //#post(void pingTimerTask(Timer)): init'ed(this.pingTimer)
    //#post(void pingTimerTask(Timer)): this.post005 == old this.post005
    //#post(void pingTimerTask(Timer)): this.sNetworkName == old this.sNetworkName
    //#post(void pingTimerTask(Timer)): this.sServerName == old this.sServerName
    //#post(void pingTimerTask(Timer)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void pingTimerTask(Timer)): init'ed(this.stringConverter)
    //#post(void pingTimerTask(Timer)): this.triedAlt == old this.triedAlt
    //#post(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1) num objects == undefined
    //#post(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1) num objects == 0, if init'ed
    //#post(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1).__Tag == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1).limit == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void pingTimerTask(Timer)): new IRCStringConverter(updateCharArrays#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void pingTimerTask(Timer)): new IRCStringConverter(updateCharArrays#1).__Tag == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void pingTimerTask(Timer)): new IRCStringConverter(updateCharArrays#1).limit == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void pingTimerTask(Timer)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void pingTimerTask(Timer)): new char[](IRCStringConverter#1).length == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void pingTimerTask(Timer)): new char[](IRCStringConverter#1)[0..65_535] == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void pingTimerTask(Timer)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void pingTimerTask(Timer)): new char[](IRCStringConverter#2).length == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void pingTimerTask(Timer)): new char[](IRCStringConverter#2)[0..65_567] == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void pingTimerTask(Timer)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void pingTimerTask(Timer)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void pingTimerTask(Timer)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1).lowercase == undefined
    //#post(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1).lowercase == null
    //#post(void pingTimerTask(Timer)): new IRCStringConverter(getIRCStringConverter#1).uppercase == new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#post(void pingTimerTask(Timer)): new IRCStringConverter(updateCharArrays#1).lowercase == new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#post(void pingTimerTask(Timer)): new IRCStringConverter(updateCharArrays#1).uppercase == new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#post(void pingTimerTask(Timer)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void pingTimerTask(Timer)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void pingTimerTask(Timer)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void pingTimerTask(Timer)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void pingTimerTask(Timer)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void pingTimerTask(Timer)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void pingTimerTask(Timer)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.util.concurrent.atomic.AtomicBoolean:get
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.util.concurrent.atomic.AtomicBoolean:set
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:doSendString
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.String
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:call
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:setAwayReason
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void pingTimerTask(Timer)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#test_vector(void pingTimerTask(Timer)): this.pingCountDown: {2..4_294_967_295}, {-2_147_483_647..1}
    //#test_vector(void pingTimerTask(Timer)): this.pingTimer: Addr_Set{null}, Inverse{null}
    //#test_vector(void pingTimerTask(Timer)): call(...)@519: {1}, {0}
    //#test_vector(void pingTimerTask(Timer)): java.lang.Object:equals(...)@1879: {0}, {1}
    //#test_vector(void pingTimerTask(Timer)): java.util.concurrent.atomic.AtomicBoolean:get(...)@1935: {0}, {1}
			if (!callPingFailed()) {
				pingTimerSem.acquireUninterruptibly();
				
				if (pingTimer != null && pingTimer.equals(timer)) {
					pingTimer.cancel();
				}
				pingTimerSem.release();
				
				disconnect("Server not responding.");
    //#IRCParser.java:1884: Warning: call too complex - analysis skipped
    //#    call on void disconnect(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void pingTimerTask(Timer)
    //#    unanalyzed callee: void disconnect(String)
			}
		} else {
			--pingCountDown;
			if (pingCountDown < 1) {
				pingTime = System.currentTimeMillis();
				setPingNeeded(true);
				pingCountDown = pingCountDownLength;
				callPingSent();
				lastPingValue = String.valueOf(System.currentTimeMillis());
				sendLine("PING " + lastPingValue);
			}
		}
	}
    //#IRCParser.java:1897: end of method: void com.dmdirc.parser.irc.IRCParser.pingTimerTask(Timer)

	/**
	 * Get the current server lag.
	 *
	 * @return Last time between sending a PING and recieving a PONG
	 */
	public long getServerLag() {
		return serverLag;
    //#IRCParser.java:1905: method: long com.dmdirc.parser.irc.IRCParser.getServerLag()
    //#input(long getServerLag()): this
    //#input(long getServerLag()): this.serverLag
    //#output(long getServerLag()): return_value
    //#pre[2] (long getServerLag()): init'ed(this.serverLag)
    //#post(long getServerLag()): return_value == this.serverLag
    //#post(long getServerLag()): init'ed(return_value)
    //#IRCParser.java:1905: end of method: long com.dmdirc.parser.irc.IRCParser.getServerLag()
	}

	/**
	 * Get the current server lag.
	 *
	 * @param actualTime if True the value returned will be the actual time the ping was sent
	 *                   else it will be the amount of time sinse the last ping was sent.
	 * @return Time last ping was sent
	 */
	public long getPingTime(final boolean actualTime) {
		if (actualTime) { return pingTime; }
    //#IRCParser.java:1916: method: long com.dmdirc.parser.irc.IRCParser.getPingTime(bool)
    //#input(long getPingTime(bool)): actualTime
    //#input(long getPingTime(bool)): this
    //#input(long getPingTime(bool)): this.pingTime
    //#output(long getPingTime(bool)): return_value
    //#pre[3] (long getPingTime(bool)): init'ed(this.pingTime)
    //#presumption(long getPingTime(bool)): java.lang.System:currentTimeMillis(...)@1917 - this.pingTime in {-9_223_372_036_854_775_808..18_446_744_073_709_551_615}
    //#post(long getPingTime(bool)): init'ed(return_value)
    //#test_vector(long getPingTime(bool)): actualTime: {0}, {1}
		else { return System.currentTimeMillis() - pingTime; }
    //#IRCParser.java:1917: end of method: long com.dmdirc.parser.irc.IRCParser.getPingTime(bool)
	}

	/**
	 * Set if a ping is needed or not.
	 *
	 * @param newStatus new value to set pingNeeded to.
	 */
	private void setPingNeeded(final boolean newStatus)  {
		pingNeeded.set(newStatus);
    //#IRCParser.java:1926: method: void com.dmdirc.parser.irc.IRCParser.setPingNeeded(bool)
    //#input(void setPingNeeded(bool)): newStatus
    //#input(void setPingNeeded(bool)): this
    //#input(void setPingNeeded(bool)): this.pingNeeded
    //#pre[3] (void setPingNeeded(bool)): this.pingNeeded != null
	}
    //#IRCParser.java:1927: end of method: void com.dmdirc.parser.irc.IRCParser.setPingNeeded(bool)

	/**
	 * Get if a ping is needed or not.
	 *
	 * @return value of pingNeeded.
	 */
	private boolean getPingNeeded()  {
		return pingNeeded.get();
    //#IRCParser.java:1935: method: bool com.dmdirc.parser.irc.IRCParser.getPingNeeded()
    //#input(bool getPingNeeded()): this
    //#input(bool getPingNeeded()): this.pingNeeded
    //#output(bool getPingNeeded()): return_value
    //#pre[2] (bool getPingNeeded()): this.pingNeeded != null
    //#post(bool getPingNeeded()): init'ed(return_value)
    //#IRCParser.java:1935: end of method: bool com.dmdirc.parser.irc.IRCParser.getPingNeeded()
	}

	/**
	 * Get a reference to the cMyself object.
	 *
	 * @return cMyself reference
	 */
	public ClientInfo getMyself() { return cMyself; }
    //#IRCParser.java:1943: method: ClientInfo com.dmdirc.parser.irc.IRCParser.getMyself()
    //#input(ClientInfo getMyself()): this
    //#input(ClientInfo getMyself()): this.cMyself
    //#output(ClientInfo getMyself()): return_value
    //#pre[2] (ClientInfo getMyself()): init'ed(this.cMyself)
    //#post(ClientInfo getMyself()): return_value == this.cMyself
    //#post(ClientInfo getMyself()): init'ed(return_value)
    //#IRCParser.java:1943: end of method: ClientInfo com.dmdirc.parser.irc.IRCParser.getMyself()

	/**
	 * Get the current nickname.
	 * If after 001 this returns the exact same as getMyself.getNickname();
	 * Before 001 it returns the nickname that the parser Thinks it has.
	 *
	 * @return Current nickname.
	 */
	public String getMyNickname() {
		if (cMyself.isFake()) {
    //#IRCParser.java:1953: method: String com.dmdirc.parser.irc.IRCParser.getMyNickname()
    //#input(String getMyNickname()): this
    //#input(String getMyNickname()): this.cMyself
    //#input(String getMyNickname()): this.cMyself.bIsFake
    //#input(String getMyNickname()): this.cMyself.sNickname
    //#input(String getMyNickname()): this.sThinkNickname
    //#output(String getMyNickname()): return_value
    //#pre[2] (String getMyNickname()): this.cMyself != null
    //#pre[3] (String getMyNickname()): init'ed(this.cMyself.bIsFake)
    //#pre[4] (String getMyNickname()): (soft) init'ed(this.cMyself.sNickname)
    //#pre[5] (String getMyNickname()): (soft) init'ed(this.sThinkNickname)
    //#post(String getMyNickname()): return_value == One-of{this.sThinkNickname, this.cMyself.sNickname}
    //#post(String getMyNickname()): init'ed(return_value)
    //#test_vector(String getMyNickname()): this.cMyself.bIsFake: {0}, {1}
			return sThinkNickname;
		} else {
			return cMyself.getNickname();
    //#IRCParser.java:1956: end of method: String com.dmdirc.parser.irc.IRCParser.getMyNickname()
		}
	}

	/**
	 * Get the current username (Specified in MyInfo on construction).
	 * Get the username given in MyInfo
	 *
	 * @return My username.
	 */
	public String getMyUsername() {
		return me.getUsername();
    //#IRCParser.java:1967: method: String com.dmdirc.parser.irc.IRCParser.getMyUsername()
    //#input(String getMyUsername()): this
    //#input(String getMyUsername()): this.me
    //#input(String getMyUsername()): this.me.username
    //#output(String getMyUsername()): return_value
    //#pre[2] (String getMyUsername()): this.me != null
    //#pre[3] (String getMyUsername()): init'ed(this.me.username)
    //#post(String getMyUsername()): return_value == this.me.username
    //#post(String getMyUsername()): init'ed(return_value)
    //#IRCParser.java:1967: end of method: String com.dmdirc.parser.irc.IRCParser.getMyUsername()
	}

	/**
	 * Add a client to the ClientList.
	 *
	 * @param client Client to add
	 */
	public void addClient(final ClientInfo client) {
		hClientList.put(getIRCStringConverter().toLowerCase(client.getNickname()),client);
    //#IRCParser.java:1976: method: void com.dmdirc.parser.irc.IRCParser.addClient(ClientInfo)
    //#IRCParser.java:1976: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: (soft) init'ed(this.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void addClient(ClientInfo)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(getIRCStringConverter(...).lowercase[0..65_535])
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: (soft) init'ed(this.lowercase[0..65_535])
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 86
    //#    VN: getIRCStringConverter(...).lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
    //#input(void addClient(ClientInfo)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void addClient(ClientInfo)): __Descendant_Table[others]
    //#input(void addClient(ClientInfo)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void addClient(ClientInfo)): client
    //#input(void addClient(ClientInfo)): client.sNickname
    //#input(void addClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void addClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void addClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void addClient(ClientInfo)): this
    //#input(void addClient(ClientInfo)): this.__Tag
    //#input(void addClient(ClientInfo)): this.hClientList
    //#input(void addClient(ClientInfo)): this.stringConverter
    //#input(void addClient(ClientInfo)): this.stringConverter.__Tag
    //#input(void addClient(ClientInfo)): this.stringConverter.lowercase
    //#input(void addClient(ClientInfo)): this.stringConverter.lowercase.length
    //#input(void addClient(ClientInfo)): this.stringConverter.lowercase[0..65_535]
    //#output(void addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void addClient(ClientInfo)): new char[](IRCStringConverter#1) num objects
    //#output(void addClient(ClientInfo)): new char[](IRCStringConverter#1).length
    //#output(void addClient(ClientInfo)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void addClient(ClientInfo)): new char[](IRCStringConverter#2) num objects
    //#output(void addClient(ClientInfo)): new char[](IRCStringConverter#2).length
    //#output(void addClient(ClientInfo)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void addClient(ClientInfo)): this.stringConverter
    //#new obj(void addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void addClient(ClientInfo)): new char[](IRCStringConverter#1)
    //#new obj(void addClient(ClientInfo)): new char[](IRCStringConverter#2)
    //#pre[1] (void addClient(ClientInfo)): client != null
    //#pre[2] (void addClient(ClientInfo)): client.sNickname != null
    //#pre[3] (void addClient(ClientInfo)): init'ed(this.stringConverter)
    //#pre[5] (void addClient(ClientInfo)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[6] (void addClient(ClientInfo)): this.hClientList != null
    //#pre[7] (void addClient(ClientInfo)): (soft) this.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[8] (void addClient(ClientInfo)): (soft) this.stringConverter.lowercase != null
    //#pre[10] (void addClient(ClientInfo)): (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#post(void addClient(ClientInfo)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void addClient(ClientInfo)): this.stringConverter != null
    //#post(void addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void addClient(ClientInfo)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void addClient(ClientInfo)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(void addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(void addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(void addClient(ClientInfo)): new char[](IRCStringConverter#1).length == 127
    //#post(void addClient(ClientInfo)): new char[](IRCStringConverter#2).length == 127
    //#post(void addClient(ClientInfo)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void addClient(ClientInfo)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void addClient(ClientInfo)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void addClient(ClientInfo)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void addClient(ClientInfo)): Effects-of-calling:java.lang.String
	}
    //#IRCParser.java:1977: end of method: void com.dmdirc.parser.irc.IRCParser.addClient(ClientInfo)

	/**
	 * Remove a client from the ClientList.
	 * This WILL NOT allow cMyself to be removed from the list.
	 *
	 * @param client Client to remove
	 */
	public void removeClient(final ClientInfo client) {
		if (client != cMyself) {
    //#IRCParser.java:1986: method: void com.dmdirc.parser.irc.IRCParser.removeClient(ClientInfo)
    //#input(void removeClient(ClientInfo)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void removeClient(ClientInfo)): __Descendant_Table[others]
    //#input(void removeClient(ClientInfo)): __Dispatch_Table.forceRemoveClient(Lcom/dmdirc/parser/irc/ClientInfo;)V
    //#input(void removeClient(ClientInfo)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void removeClient(ClientInfo)): client
    //#input(void removeClient(ClientInfo)): client.sNickname
    //#input(void removeClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void removeClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void removeClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void removeClient(ClientInfo)): this
    //#input(void removeClient(ClientInfo)): this.__Tag
    //#input(void removeClient(ClientInfo)): this.cMyself
    //#input(void removeClient(ClientInfo)): this.hClientList
    //#input(void removeClient(ClientInfo)): this.stringConverter
    //#input(void removeClient(ClientInfo)): this.stringConverter.__Tag
    //#input(void removeClient(ClientInfo)): this.stringConverter.lowercase
    //#input(void removeClient(ClientInfo)): this.stringConverter.lowercase.length
    //#input(void removeClient(ClientInfo)): this.stringConverter.lowercase[0..65_535]
    //#output(void removeClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void removeClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void removeClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void removeClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void removeClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void removeClient(ClientInfo)): new char[](IRCStringConverter#1) num objects
    //#output(void removeClient(ClientInfo)): new char[](IRCStringConverter#1).length
    //#output(void removeClient(ClientInfo)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void removeClient(ClientInfo)): new char[](IRCStringConverter#2) num objects
    //#output(void removeClient(ClientInfo)): new char[](IRCStringConverter#2).length
    //#output(void removeClient(ClientInfo)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void removeClient(ClientInfo)): this.stringConverter
    //#new obj(void removeClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void removeClient(ClientInfo)): new char[](IRCStringConverter#1)
    //#new obj(void removeClient(ClientInfo)): new char[](IRCStringConverter#2)
    //#pre[7] (void removeClient(ClientInfo)): init'ed(this.cMyself)
    //#pre[1] (void removeClient(ClientInfo)): (soft) client != null
    //#pre[3] (void removeClient(ClientInfo)): (soft) client.sNickname != null
    //#pre[4] (void removeClient(ClientInfo)): (soft) init'ed(this.stringConverter)
    //#pre[6] (void removeClient(ClientInfo)): (soft) this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[8] (void removeClient(ClientInfo)): (soft) this.hClientList != null
    //#pre[9] (void removeClient(ClientInfo)): (soft) this.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[10] (void removeClient(ClientInfo)): (soft) this.stringConverter.lowercase != null
    //#pre[12] (void removeClient(ClientInfo)): (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#post(void removeClient(ClientInfo)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void removeClient(ClientInfo)): init'ed(this.stringConverter)
    //#post(void removeClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void removeClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void removeClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(void removeClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(void removeClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(void removeClient(ClientInfo)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void removeClient(ClientInfo)): new char[](IRCStringConverter#1).length == 127
    //#post(void removeClient(ClientInfo)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void removeClient(ClientInfo)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void removeClient(ClientInfo)): new char[](IRCStringConverter#2).length == 127
    //#post(void removeClient(ClientInfo)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void removeClient(ClientInfo)): Effects-of-calling:getNickname
    //#unanalyzed(void removeClient(ClientInfo)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void removeClient(ClientInfo)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void removeClient(ClientInfo)): Effects-of-calling:java.lang.String
    //#unanalyzed(void removeClient(ClientInfo)): Effects-of-calling:java.util.Map:remove
    //#test_vector(void removeClient(ClientInfo)): client == this.cMyself: {1}, {0}
			forceRemoveClient(client);
    //#IRCParser.java:1987: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCParser.forceRemoveClient: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void removeClient(ClientInfo)
    //#    basic block: bb_2
    //#    assertion: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    callee: void com/dmdirc/parser/irc/IRCParser.forceRemoveClient(ClientInfo)
    //#    callee assertion: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    callee file: IRCParser.java
    //#    callee precondition index: [10]
    //#    callee srcpos: 1998
    //#    VN: this.stringConverter.lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
		}
	}
    //#IRCParser.java:1989: end of method: void com.dmdirc.parser.irc.IRCParser.removeClient(ClientInfo)

	/**
	 * Remove a client from the ClientList.
.	 * This WILL allow cMyself to be removed from the list
	 *
	 * @param client Client to remove
	 */
	protected void forceRemoveClient(final ClientInfo client) {
		hClientList.remove(getIRCStringConverter().toLowerCase(client.getNickname()));
    //#IRCParser.java:1998: method: void com.dmdirc.parser.irc.IRCParser.forceRemoveClient(ClientInfo)
    //#IRCParser.java:1998: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: (soft) init'ed(this.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void forceRemoveClient(ClientInfo)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(getIRCStringConverter(...).lowercase[0..65_535])
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: (soft) init'ed(this.lowercase[0..65_535])
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 86
    //#    VN: getIRCStringConverter(...).lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
    //#input(void forceRemoveClient(ClientInfo)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void forceRemoveClient(ClientInfo)): __Descendant_Table[others]
    //#input(void forceRemoveClient(ClientInfo)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void forceRemoveClient(ClientInfo)): client
    //#input(void forceRemoveClient(ClientInfo)): client.sNickname
    //#input(void forceRemoveClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void forceRemoveClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void forceRemoveClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void forceRemoveClient(ClientInfo)): this
    //#input(void forceRemoveClient(ClientInfo)): this.__Tag
    //#input(void forceRemoveClient(ClientInfo)): this.hClientList
    //#input(void forceRemoveClient(ClientInfo)): this.stringConverter
    //#input(void forceRemoveClient(ClientInfo)): this.stringConverter.__Tag
    //#input(void forceRemoveClient(ClientInfo)): this.stringConverter.lowercase
    //#input(void forceRemoveClient(ClientInfo)): this.stringConverter.lowercase.length
    //#input(void forceRemoveClient(ClientInfo)): this.stringConverter.lowercase[0..65_535]
    //#output(void forceRemoveClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void forceRemoveClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void forceRemoveClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void forceRemoveClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void forceRemoveClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void forceRemoveClient(ClientInfo)): new char[](IRCStringConverter#1) num objects
    //#output(void forceRemoveClient(ClientInfo)): new char[](IRCStringConverter#1).length
    //#output(void forceRemoveClient(ClientInfo)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void forceRemoveClient(ClientInfo)): new char[](IRCStringConverter#2) num objects
    //#output(void forceRemoveClient(ClientInfo)): new char[](IRCStringConverter#2).length
    //#output(void forceRemoveClient(ClientInfo)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void forceRemoveClient(ClientInfo)): this.stringConverter
    //#new obj(void forceRemoveClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void forceRemoveClient(ClientInfo)): new char[](IRCStringConverter#1)
    //#new obj(void forceRemoveClient(ClientInfo)): new char[](IRCStringConverter#2)
    //#pre[1] (void forceRemoveClient(ClientInfo)): client != null
    //#pre[2] (void forceRemoveClient(ClientInfo)): client.sNickname != null
    //#pre[3] (void forceRemoveClient(ClientInfo)): init'ed(this.stringConverter)
    //#pre[5] (void forceRemoveClient(ClientInfo)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[6] (void forceRemoveClient(ClientInfo)): this.hClientList != null
    //#pre[7] (void forceRemoveClient(ClientInfo)): (soft) this.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[8] (void forceRemoveClient(ClientInfo)): (soft) this.stringConverter.lowercase != null
    //#pre[10] (void forceRemoveClient(ClientInfo)): (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#post(void forceRemoveClient(ClientInfo)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void forceRemoveClient(ClientInfo)): this.stringConverter != null
    //#post(void forceRemoveClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void forceRemoveClient(ClientInfo)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void forceRemoveClient(ClientInfo)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void forceRemoveClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void forceRemoveClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(void forceRemoveClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(void forceRemoveClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(void forceRemoveClient(ClientInfo)): new char[](IRCStringConverter#1).length == 127
    //#post(void forceRemoveClient(ClientInfo)): new char[](IRCStringConverter#2).length == 127
    //#post(void forceRemoveClient(ClientInfo)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void forceRemoveClient(ClientInfo)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void forceRemoveClient(ClientInfo)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void forceRemoveClient(ClientInfo)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void forceRemoveClient(ClientInfo)): Effects-of-calling:java.lang.String
	}
    //#IRCParser.java:1999: end of method: void com.dmdirc.parser.irc.IRCParser.forceRemoveClient(ClientInfo)

	/**
	 * Get the number of known clients.
	 *
	 * @return Count of known clients
	 */
	public int knownClients() {
		return hClientList.size();
    //#IRCParser.java:2007: method: int com.dmdirc.parser.irc.IRCParser.knownClients()
    //#input(int knownClients()): this
    //#input(int knownClients()): this.hClientList
    //#output(int knownClients()): return_value
    //#pre[2] (int knownClients()): this.hClientList != null
    //#post(int knownClients()): init'ed(return_value)
    //#IRCParser.java:2007: end of method: int com.dmdirc.parser.irc.IRCParser.knownClients()
	}

	/**
	 * Get the known clients as a collection.
	 *
	 * @return Known clients as a collection
	 */
	public Collection<ClientInfo> getClients() {
		return hClientList.values();
    //#IRCParser.java:2016: method: Collection com.dmdirc.parser.irc.IRCParser.getClients()
    //#input(Collection getClients()): this
    //#input(Collection getClients()): this.hClientList
    //#output(Collection getClients()): return_value
    //#pre[2] (Collection getClients()): this.hClientList != null
    //#post(Collection getClients()): init'ed(return_value)
    //#IRCParser.java:2016: end of method: Collection com.dmdirc.parser.irc.IRCParser.getClients()
	}

	/**
	 * Clear the client list.
	 */
	public void clearClients() {
		hClientList.clear();
    //#IRCParser.java:2023: method: void com.dmdirc.parser.irc.IRCParser.clearClients()
    //#input(void clearClients()): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void clearClients()): __Descendant_Table[others]
    //#input(void clearClients()): __Dispatch_Table.addClient(Lcom/dmdirc/parser/irc/ClientInfo;)V
    //#input(void clearClients()): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void clearClients()): __Dispatch_Table.getMyself()Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(void clearClients()): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void clearClients()): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void clearClients()): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void clearClients()): this
    //#input(void clearClients()): this.__Tag
    //#input(void clearClients()): this.cMyself
    //#input(void clearClients()): this.cMyself.sNickname
    //#input(void clearClients()): this.hClientList
    //#input(void clearClients()): this.stringConverter
    //#input(void clearClients()): this.stringConverter.__Tag
    //#input(void clearClients()): this.stringConverter.lowercase
    //#input(void clearClients()): this.stringConverter.lowercase.length
    //#input(void clearClients()): this.stringConverter.lowercase[0..65_535]
    //#output(void clearClients()): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void clearClients()): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void clearClients()): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void clearClients()): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void clearClients()): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void clearClients()): new char[](IRCStringConverter#1) num objects
    //#output(void clearClients()): new char[](IRCStringConverter#1).length
    //#output(void clearClients()): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void clearClients()): new char[](IRCStringConverter#2) num objects
    //#output(void clearClients()): new char[](IRCStringConverter#2).length
    //#output(void clearClients()): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void clearClients()): this.stringConverter
    //#new obj(void clearClients()): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void clearClients()): new char[](IRCStringConverter#1)
    //#new obj(void clearClients()): new char[](IRCStringConverter#2)
    //#pre[1] (void clearClients()): init'ed(this.stringConverter)
    //#pre[3] (void clearClients()): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[4] (void clearClients()): this.cMyself != null
    //#pre[5] (void clearClients()): this.cMyself.sNickname != null
    //#pre[6] (void clearClients()): this.hClientList != null
    //#pre[7] (void clearClients()): (soft) this.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[8] (void clearClients()): (soft) this.stringConverter.lowercase != null
    //#pre[10] (void clearClients()): (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#post(void clearClients()): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void clearClients()): this.stringConverter != null
    //#post(void clearClients()): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void clearClients()): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void clearClients()): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void clearClients()): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void clearClients()): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(void clearClients()): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(void clearClients()): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(void clearClients()): new char[](IRCStringConverter#1).length == 127
    //#post(void clearClients()): new char[](IRCStringConverter#2).length == 127
    //#post(void clearClients()): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void clearClients()): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void clearClients()): Effects-of-calling:getNickname
    //#unanalyzed(void clearClients()): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void clearClients()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void clearClients()): Effects-of-calling:java.lang.String
    //#unanalyzed(void clearClients()): Effects-of-calling:java.util.Map:put
		addClient(getMyself());
    //#IRCParser.java:2024: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCParser.addClient: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void clearClients()
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    callee: void com/dmdirc/parser/irc/IRCParser.addClient(ClientInfo)
    //#    callee assertion: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    callee file: IRCParser.java
    //#    callee precondition index: [10]
    //#    callee srcpos: 1976
    //#    VN: this.stringConverter.lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
	}
    //#IRCParser.java:2025: end of method: void com.dmdirc.parser.irc.IRCParser.clearClients()

	/**
	 * Add a channel to the ChannelList.
	 *
	 * @param channel Channel to add
	 */
	public void addChannel(final ChannelInfo channel) {
		synchronized (hChannelList) {
    //#IRCParser.java:2033: method: void com.dmdirc.parser.irc.IRCParser.addChannel(ChannelInfo)
    //#input(void addChannel(ChannelInfo)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void addChannel(ChannelInfo)): __Descendant_Table[others]
    //#input(void addChannel(ChannelInfo)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void addChannel(ChannelInfo)): channel
    //#input(void addChannel(ChannelInfo)): channel.__Tag
    //#input(void addChannel(ChannelInfo)): channel.sName
    //#input(void addChannel(ChannelInfo)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void addChannel(ChannelInfo)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void addChannel(ChannelInfo)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void addChannel(ChannelInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void addChannel(ChannelInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void addChannel(ChannelInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void addChannel(ChannelInfo)): this
    //#input(void addChannel(ChannelInfo)): this.__Tag
    //#input(void addChannel(ChannelInfo)): this.hChannelList
    //#input(void addChannel(ChannelInfo)): this.hChannelList.__Lock
    //#input(void addChannel(ChannelInfo)): this.stringConverter
    //#input(void addChannel(ChannelInfo)): this.stringConverter.__Tag
    //#input(void addChannel(ChannelInfo)): this.stringConverter.lowercase
    //#input(void addChannel(ChannelInfo)): this.stringConverter.lowercase.length
    //#input(void addChannel(ChannelInfo)): this.stringConverter.lowercase[0..65_535]
    //#output(void addChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void addChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void addChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void addChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void addChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void addChannel(ChannelInfo)): new char[](IRCStringConverter#1) num objects
    //#output(void addChannel(ChannelInfo)): new char[](IRCStringConverter#1).length
    //#output(void addChannel(ChannelInfo)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void addChannel(ChannelInfo)): new char[](IRCStringConverter#2) num objects
    //#output(void addChannel(ChannelInfo)): new char[](IRCStringConverter#2).length
    //#output(void addChannel(ChannelInfo)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void addChannel(ChannelInfo)): this.stringConverter
    //#new obj(void addChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void addChannel(ChannelInfo)): new char[](IRCStringConverter#1)
    //#new obj(void addChannel(ChannelInfo)): new char[](IRCStringConverter#2)
    //#pre[1] (void addChannel(ChannelInfo)): channel != null
    //#pre[2] (void addChannel(ChannelInfo)): channel.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#pre[3] (void addChannel(ChannelInfo)): channel.sName != null
    //#pre[4] (void addChannel(ChannelInfo)): init'ed(this.stringConverter)
    //#pre[6] (void addChannel(ChannelInfo)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[7] (void addChannel(ChannelInfo)): this.hChannelList != null
    //#pre[8] (void addChannel(ChannelInfo)): (soft) this.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[9] (void addChannel(ChannelInfo)): (soft) this.stringConverter.lowercase != null
    //#pre[11] (void addChannel(ChannelInfo)): (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#post(void addChannel(ChannelInfo)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void addChannel(ChannelInfo)): this.stringConverter != null
    //#post(void addChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void addChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void addChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(void addChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(void addChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(void addChannel(ChannelInfo)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void addChannel(ChannelInfo)): new char[](IRCStringConverter#1).length == 127
    //#post(void addChannel(ChannelInfo)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void addChannel(ChannelInfo)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void addChannel(ChannelInfo)): new char[](IRCStringConverter#2).length == 127
    //#post(void addChannel(ChannelInfo)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void addChannel(ChannelInfo)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void addChannel(ChannelInfo)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void addChannel(ChannelInfo)): Effects-of-calling:java.lang.String
			hChannelList.put(getIRCStringConverter().toLowerCase(channel.getName()), channel);
    //#IRCParser.java:2034: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: (soft) init'ed(this.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void addChannel(ChannelInfo)
    //#    basic block: bb_2
    //#    assertion: (soft) init'ed(getIRCStringConverter(...).lowercase[0..65_535])
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: (soft) init'ed(this.lowercase[0..65_535])
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 86
    //#    VN: getIRCStringConverter(...).lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
		}
	}
    //#IRCParser.java:2036: end of method: void com.dmdirc.parser.irc.IRCParser.addChannel(ChannelInfo)

	/**
	 * Remove a channel from the ChannelList.
	 *
	 * @param channel Channel to remove
	 */
	public void removeChannel(final ChannelInfo channel) {
		synchronized (hChannelList) {
    //#IRCParser.java:2044: method: void com.dmdirc.parser.irc.IRCParser.removeChannel(ChannelInfo)
    //#input(void removeChannel(ChannelInfo)): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void removeChannel(ChannelInfo)): __Descendant_Table[others]
    //#input(void removeChannel(ChannelInfo)): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void removeChannel(ChannelInfo)): channel
    //#input(void removeChannel(ChannelInfo)): channel.__Tag
    //#input(void removeChannel(ChannelInfo)): channel.sName
    //#input(void removeChannel(ChannelInfo)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void removeChannel(ChannelInfo)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void removeChannel(ChannelInfo)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void removeChannel(ChannelInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void removeChannel(ChannelInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void removeChannel(ChannelInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void removeChannel(ChannelInfo)): this
    //#input(void removeChannel(ChannelInfo)): this.__Tag
    //#input(void removeChannel(ChannelInfo)): this.hChannelList
    //#input(void removeChannel(ChannelInfo)): this.hChannelList.__Lock
    //#input(void removeChannel(ChannelInfo)): this.stringConverter
    //#input(void removeChannel(ChannelInfo)): this.stringConverter.__Tag
    //#input(void removeChannel(ChannelInfo)): this.stringConverter.lowercase
    //#input(void removeChannel(ChannelInfo)): this.stringConverter.lowercase.length
    //#input(void removeChannel(ChannelInfo)): this.stringConverter.lowercase[0..65_535]
    //#output(void removeChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void removeChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void removeChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void removeChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void removeChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void removeChannel(ChannelInfo)): new char[](IRCStringConverter#1) num objects
    //#output(void removeChannel(ChannelInfo)): new char[](IRCStringConverter#1).length
    //#output(void removeChannel(ChannelInfo)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void removeChannel(ChannelInfo)): new char[](IRCStringConverter#2) num objects
    //#output(void removeChannel(ChannelInfo)): new char[](IRCStringConverter#2).length
    //#output(void removeChannel(ChannelInfo)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void removeChannel(ChannelInfo)): this.stringConverter
    //#new obj(void removeChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void removeChannel(ChannelInfo)): new char[](IRCStringConverter#1)
    //#new obj(void removeChannel(ChannelInfo)): new char[](IRCStringConverter#2)
    //#pre[1] (void removeChannel(ChannelInfo)): channel != null
    //#pre[2] (void removeChannel(ChannelInfo)): channel.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#pre[3] (void removeChannel(ChannelInfo)): channel.sName != null
    //#pre[4] (void removeChannel(ChannelInfo)): init'ed(this.stringConverter)
    //#pre[6] (void removeChannel(ChannelInfo)): this.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[7] (void removeChannel(ChannelInfo)): this.hChannelList != null
    //#pre[8] (void removeChannel(ChannelInfo)): (soft) this.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[9] (void removeChannel(ChannelInfo)): (soft) this.stringConverter.lowercase != null
    //#pre[11] (void removeChannel(ChannelInfo)): (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#post(void removeChannel(ChannelInfo)): this.stringConverter == One-of{old this.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void removeChannel(ChannelInfo)): this.stringConverter != null
    //#post(void removeChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void removeChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void removeChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(void removeChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(void removeChannel(ChannelInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(void removeChannel(ChannelInfo)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void removeChannel(ChannelInfo)): new char[](IRCStringConverter#1).length == 127
    //#post(void removeChannel(ChannelInfo)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void removeChannel(ChannelInfo)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void removeChannel(ChannelInfo)): new char[](IRCStringConverter#2).length == 127
    //#post(void removeChannel(ChannelInfo)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void removeChannel(ChannelInfo)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void removeChannel(ChannelInfo)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void removeChannel(ChannelInfo)): Effects-of-calling:java.lang.String
			hChannelList.remove(getIRCStringConverter().toLowerCase(channel.getName()));
    //#IRCParser.java:2045: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: (soft) init'ed(this.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.IRCParser
    //#    method: void removeChannel(ChannelInfo)
    //#    basic block: bb_2
    //#    assertion: (soft) init'ed(getIRCStringConverter(...).lowercase[0..65_535])
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: (soft) init'ed(this.lowercase[0..65_535])
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 86
    //#    VN: getIRCStringConverter(...).lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
		}
	}
    //#IRCParser.java:2047: end of method: void com.dmdirc.parser.irc.IRCParser.removeChannel(ChannelInfo)

	/**
	 * Get the number of known channel.
	 *
	 * @return Count of known channel
	 */
	public int knownChannels() {
		synchronized (hChannelList) {
    //#IRCParser.java:2055: method: int com.dmdirc.parser.irc.IRCParser.knownChannels()
    //#input(int knownChannels()): this
    //#input(int knownChannels()): this.hChannelList
    //#input(int knownChannels()): this.hChannelList.__Lock
    //#output(int knownChannels()): return_value
    //#pre[2] (int knownChannels()): this.hChannelList != null
    //#post(int knownChannels()): init'ed(return_value)
			return hChannelList.size();
		}
    //#IRCParser.java:2057: end of method: int com.dmdirc.parser.irc.IRCParser.knownChannels()
	}

	/**
	 * Get the known channels as a collection.
	 *
	 * @return Known channels as a collection
	 */
	public Collection<ChannelInfo> getChannels() {
		synchronized (hChannelList) {
    //#IRCParser.java:2066: method: Collection com.dmdirc.parser.irc.IRCParser.getChannels()
    //#input(Collection getChannels()): this
    //#input(Collection getChannels()): this.hChannelList
    //#input(Collection getChannels()): this.hChannelList.__Lock
    //#output(Collection getChannels()): return_value
    //#pre[2] (Collection getChannels()): this.hChannelList != null
    //#post(Collection getChannels()): init'ed(return_value)
			return hChannelList.values();
		}
    //#IRCParser.java:2068: end of method: Collection com.dmdirc.parser.irc.IRCParser.getChannels()
	}

	/**
	 * Clear the channel list.
	 */
	public void clearChannels() {
		synchronized (hChannelList) {
    //#IRCParser.java:2075: method: void com.dmdirc.parser.irc.IRCParser.clearChannels()
    //#input(void clearChannels()): this
    //#input(void clearChannels()): this.hChannelList
    //#input(void clearChannels()): this.hChannelList.__Lock
    //#pre[2] (void clearChannels()): this.hChannelList != null
			hChannelList.clear();
		}
	}
    //#IRCParser.java:2078: end of method: void com.dmdirc.parser.irc.IRCParser.clearChannels()

}
    //#output(com.dmdirc.parser.irc.IRCParser$1__static_init): __Descendant_Table[com/dmdirc/parser/irc/IRCParser$1]
    //#output(com.dmdirc.parser.irc.IRCParser$1__static_init): __Dispatch_Table.checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser$1__static_init): __Dispatch_Table.checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser$1__static_init): __Dispatch_Table.getAcceptedIssuers()[Ljava/security/cert/X509Certificate;
    //#post(com.dmdirc.parser.irc.IRCParser$1__static_init): __Descendant_Table[com/dmdirc/parser/irc/IRCParser$1] == &__Dispatch_Table
    //#post(com.dmdirc.parser.irc.IRCParser$1__static_init): __Dispatch_Table.checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V == &checkClientTrusted
    //#post(com.dmdirc.parser.irc.IRCParser$1__static_init): __Dispatch_Table.checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V == &checkServerTrusted
    //#post(com.dmdirc.parser.irc.IRCParser$1__static_init): __Dispatch_Table.getAcceptedIssuers()[Ljava/security/cert/X509Certificate; == &getAcceptedIssuers
    //#IRCParser.java:: end of method: com.dmdirc.parser.irc.IRCParser$1.com.dmdirc.parser.irc.IRCParser$1__static_init
    //#IRCParser.java:: end of class: com.dmdirc.parser.irc.IRCParser$1
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.addChannel(Lcom/dmdirc/parser/irc/ChannelInfo;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.addClient(Lcom/dmdirc/parser/irc/ClientInfo;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callConnectError(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callDataIn(Ljava/lang/String;)Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callDebugInfo(ILjava/lang/String;[Ljava/lang/Object;)Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callPingFailed()Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callPingSent()Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callPingSuccess()Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callPost005()Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callServerError(Ljava/lang/String;)Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callSocketClosed()Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.clearChannels()V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.clearClients()V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.connect()V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.disconnect(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.finalize()V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.forceRemoveClient(Lcom/dmdirc/parser/irc/ClientInfo;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.get005()Ljava/util/Map;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getAddLastLine()Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getAutoListMode()Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getBindIP()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getBoolChanModes()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getBoolChanModes005()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getChannels()Ljava/util/Collection;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getClientInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ClientInfo;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getClientInfoOrFake(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ClientInfo;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getClients()Ljava/util/Collection;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getCreateFake()Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getDefaultTrustManager()[Ljavax/net/ssl/TrustManager;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getDisconnectOnFatal()Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getIRCD(Z)Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getIgnoreList()Lcom/dmdirc/parser/irc/RegexStringList;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getLastLine()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getListChanModes()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getLocalPort()I
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getMaxLength(I)I
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getMaxLength(Ljava/lang/String;Ljava/lang/String;)I
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getMaxListModes(C)I
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getMyNickname()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getMyUsername()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getMyself()Lcom/dmdirc/parser/irc/ClientInfo;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getNetworkName()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getOtherModeString(B)Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getPingCountDownLength()I
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getPingNeeded()Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getPingTime(Z)J
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getPingTimerLength()J
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getPrefixModes()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getProcessingManager()Lcom/dmdirc/parser/irc/ProcessingManager;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getRemoveAfterCallback()Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getServerLag()J
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getServerName()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getSetOnlyChanModes()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getSetUnsetChanModes()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getTrustManager()[Ljavax/net/ssl/TrustManager;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getUserModeString()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.handleConnectException(Ljava/lang/Exception;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.isReady()Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.isUserSettable(Ljava/lang/Character;)Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.isValidChannelName(Ljava/lang/String;)Z
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.joinChannel(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.joinChannel(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.joinChannel(Ljava/lang/String;Ljava/lang/String;Z)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.joinChannel(Ljava/lang/String;Z)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.knownChannels()I
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.knownClients()I
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.onPostErrorInfo(Lcom/dmdirc/parser/irc/ParserError;Z)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.parseChanModes()V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.parseChanPrefix()V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.parsePrefixModes()V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.parseUserModes()V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.partChannel(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.pingTimerTask(Ljava/util/Timer;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.processLine(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.quit(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.removeChannel(Lcom/dmdirc/parser/irc/ChannelInfo;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.removeClient(Lcom/dmdirc/parser/irc/ClientInfo;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.resetState()V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.run()V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendAction(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendCTCP(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendCTCPReply(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendConnectionStrings()V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendLine(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendMessage(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendNotice(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setAddLastLine(Z)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setAutoListMode(Z)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setBindIP(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setCreateFake(Z)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setDisconnectOnFatal(Z)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setIgnoreList(Lcom/dmdirc/parser/irc/RegexStringList;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setKeyManagers([Ljavax/net/ssl/KeyManager;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setNickname(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setPingCountDownLength(I)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setPingNeeded(Z)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setPingTimerLength(J)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setRemoveAfterCallback(Z)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setTrustManager([Ljavax/net/ssl/TrustManager;)V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.startPingTimer()V
    //#output(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.updateCharArrays(B)V
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Descendant_Table[com/dmdirc/parser/irc/IRCParser] == &__Dispatch_Table
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.addChannel(Lcom/dmdirc/parser/irc/ChannelInfo;)V == &addChannel
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.addClient(Lcom/dmdirc/parser/irc/ClientInfo;)V == &addClient
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callConnectError(Lcom/dmdirc/parser/irc/ParserError;)Z == &callConnectError
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callDataIn(Ljava/lang/String;)Z == &callDataIn
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z == &callDataOut
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z == &callDebugInfo
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callDebugInfo(ILjava/lang/String;[Ljava/lang/Object;)Z == &callDebugInfo
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z == &callErrorInfo
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callPingFailed()Z == &callPingFailed
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callPingSent()Z == &callPingSent
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callPingSuccess()Z == &callPingSuccess
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callPost005()Z == &callPost005
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callServerError(Ljava/lang/String;)Z == &callServerError
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.callSocketClosed()Z == &callSocketClosed
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.clearChannels()V == &clearChannels
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.clearClients()V == &clearClients
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.connect()V == &connect
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.disconnect(Ljava/lang/String;)V == &disconnect
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.doSendString(Ljava/lang/String;Z)V == &doSendString
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.finalize()V == &finalize
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.forceRemoveClient(Lcom/dmdirc/parser/irc/ClientInfo;)V == &forceRemoveClient
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.get005()Ljava/util/Map; == &get005
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getAddLastLine()Z == &getAddLastLine
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getAutoListMode()Z == &getAutoListMode
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getBindIP()Ljava/lang/String; == &getBindIP
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getBoolChanModes()Ljava/lang/String; == &getBoolChanModes
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getBoolChanModes005()Ljava/lang/String; == &getBoolChanModes005
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager; == &getCallbackManager
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo; == &getChannelInfo
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getChannels()Ljava/util/Collection; == &getChannels
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getClientInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ClientInfo; == &getClientInfo
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getClientInfoOrFake(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ClientInfo; == &getClientInfoOrFake
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getClients()Ljava/util/Collection; == &getClients
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getCreateFake()Z == &getCreateFake
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getDefaultTrustManager()[Ljavax/net/ssl/TrustManager; == &getDefaultTrustManager
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getDisconnectOnFatal()Z == &getDisconnectOnFatal
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getIRCD(Z)Ljava/lang/String; == &getIRCD
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter; == &getIRCStringConverter
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getIgnoreList()Lcom/dmdirc/parser/irc/RegexStringList; == &getIgnoreList
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getLastLine()Ljava/lang/String; == &getLastLine
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getListChanModes()Ljava/lang/String; == &getListChanModes
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getLocalPort()I == &getLocalPort
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getMaxLength(I)I == &getMaxLength
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getMaxLength(Ljava/lang/String;Ljava/lang/String;)I == &getMaxLength
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getMaxListModes(C)I == &getMaxListModes
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getMyNickname()Ljava/lang/String; == &getMyNickname
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getMyUsername()Ljava/lang/String; == &getMyUsername
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getMyself()Lcom/dmdirc/parser/irc/ClientInfo; == &getMyself
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getNetworkName()Ljava/lang/String; == &getNetworkName
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getOtherModeString(B)Ljava/lang/String; == &getOtherModeString
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getPingCountDownLength()I == &getPingCountDownLength
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getPingNeeded()Z == &getPingNeeded
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getPingTime(Z)J == &getPingTime
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getPingTimerLength()J == &getPingTimerLength
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getPrefixModes()Ljava/lang/String; == &getPrefixModes
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getProcessingManager()Lcom/dmdirc/parser/irc/ProcessingManager; == &getProcessingManager
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getRemoveAfterCallback()Z == &getRemoveAfterCallback
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getServerLag()J == &getServerLag
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getServerName()Ljava/lang/String; == &getServerName
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getSetOnlyChanModes()Ljava/lang/String; == &getSetOnlyChanModes
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getSetUnsetChanModes()Ljava/lang/String; == &getSetUnsetChanModes
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState; == &getSocketState
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getTrustManager()[Ljavax/net/ssl/TrustManager; == &getTrustManager
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.getUserModeString()Ljava/lang/String; == &getUserModeString
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.handleConnectException(Ljava/lang/Exception;)V == &handleConnectException
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.isReady()Z == &isReady
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.isUserSettable(Ljava/lang/Character;)Z == &isUserSettable
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.isValidChannelName(Ljava/lang/String;)Z == &isValidChannelName
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.joinChannel(Ljava/lang/String;)V == &joinChannel
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.joinChannel(Ljava/lang/String;Ljava/lang/String;)V == &joinChannel
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.joinChannel(Ljava/lang/String;Ljava/lang/String;Z)V == &joinChannel
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.joinChannel(Ljava/lang/String;Z)V == &joinChannel
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.knownChannels()I == &knownChannels
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.knownClients()I == &knownClients
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.onPostErrorInfo(Lcom/dmdirc/parser/irc/ParserError;Z)V == &onPostErrorInfo
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.parseChanModes()V == &parseChanModes
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.parseChanPrefix()V == &parseChanPrefix
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.parsePrefixModes()V == &parsePrefixModes
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.parseUserModes()V == &parseUserModes
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.partChannel(Ljava/lang/String;Ljava/lang/String;)V == &partChannel
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.pingTimerTask(Ljava/util/Timer;)V == &pingTimerTask
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.processLine(Ljava/lang/String;)V == &processLine
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.quit(Ljava/lang/String;)V == &quit
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.removeChannel(Lcom/dmdirc/parser/irc/ChannelInfo;)V == &removeChannel
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.removeClient(Lcom/dmdirc/parser/irc/ClientInfo;)V == &removeClient
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.resetState()V == &resetState
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.run()V == &run
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendAction(Ljava/lang/String;Ljava/lang/String;)V == &sendAction
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendCTCP(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V == &sendCTCP
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendCTCPReply(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V == &sendCTCPReply
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendConnectionStrings()V == &sendConnectionStrings
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendLine(Ljava/lang/String;)V == &sendLine
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendMessage(Ljava/lang/String;Ljava/lang/String;)V == &sendMessage
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendNotice(Ljava/lang/String;Ljava/lang/String;)V == &sendNotice
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.sendString(Ljava/lang/String;)V == &sendString
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setAddLastLine(Z)V == &setAddLastLine
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setAutoListMode(Z)V == &setAutoListMode
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setBindIP(Ljava/lang/String;)V == &setBindIP
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setCreateFake(Z)V == &setCreateFake
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setDisconnectOnFatal(Z)V == &setDisconnectOnFatal
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setIgnoreList(Lcom/dmdirc/parser/irc/RegexStringList;)V == &setIgnoreList
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setKeyManagers([Ljavax/net/ssl/KeyManager;)V == &setKeyManagers
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setNickname(Ljava/lang/String;)V == &setNickname
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setPingCountDownLength(I)V == &setPingCountDownLength
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setPingNeeded(Z)V == &setPingNeeded
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setPingTimerLength(J)V == &setPingTimerLength
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setRemoveAfterCallback(Z)V == &setRemoveAfterCallback
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.setTrustManager([Ljavax/net/ssl/TrustManager;)V == &setTrustManager
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.startPingTimer()V == &startPingTimer
    //#post(com.dmdirc.parser.irc.IRCParser__static_init): __Dispatch_Table.updateCharArrays(B)V == &updateCharArrays
    //#IRCParser.java:: end of method: com.dmdirc.parser.irc.IRCParser.com.dmdirc.parser.irc.IRCParser__static_init
    //#IRCParser.java:: end of class: com.dmdirc.parser.irc.IRCParser
