//# 8 errors, 1,117 messages
//#
/*
    //#WritableFrameContainer.java:1:1: class: com.dmdirc.WritableFrameContainer
 * 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;

import com.dmdirc.actions.ActionManager;
import com.dmdirc.actions.interfaces.ActionType;
import com.dmdirc.config.ConfigManager;
import com.dmdirc.logger.ErrorLevel;
import com.dmdirc.logger.Logger;
import com.dmdirc.ui.WindowManager;
import com.dmdirc.ui.interfaces.InputWindow;
import com.dmdirc.ui.interfaces.Window;

import java.util.ArrayList;
import java.util.List;

/**
 * The writable frame container adds additional methods to the frame container
 * class that allow the sending of lines back to whatever the container's
 * data source is (e.g. an IRC channel or server).
 *
 * @author chris
 */
public abstract class WritableFrameContainer extends FrameContainer {
    //#WritableFrameContainer.java:44: method: Window com.dmdirc.WritableFrameContainer.getFrame()
    //#WritableFrameContainer.java:44: Warning: call too complex - analysis skipped
    //#    call on InputWindow getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: Window getFrame()
    //#    unanalyzed callee: InputWindow getFrame()
    //#WritableFrameContainer.java:44: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: Window getFrame()
    //#    suspicious precondition index: [2]
    //#input(Window getFrame()): __Descendant_Table[com/dmdirc/Channel]
    //#input(Window getFrame()): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(Window getFrame()): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(Window getFrame()): __Descendant_Table[com/dmdirc/Query]
    //#input(Window getFrame()): __Descendant_Table[com/dmdirc/Raw]
    //#input(Window getFrame()): __Descendant_Table[com/dmdirc/Server]
    //#input(Window getFrame()): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(Window getFrame()): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(Window getFrame()): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(Window getFrame()): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(Window getFrame()): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(Window getFrame()): __Descendant_Table[others]
    //#input(Window getFrame()): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(Window getFrame()): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(Window getFrame()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(Window getFrame()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(Window getFrame()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(Window getFrame()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(Window getFrame()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(Window getFrame()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(Window getFrame()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(Window getFrame()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(Window getFrame()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(Window getFrame()): this
    //#input(Window getFrame()): this.__Tag
    //#output(Window getFrame()): return_value
    //#pre[2] (Window getFrame()): this.__Tag in {com/dmdirc/Channel, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#post(Window getFrame()): init'ed(return_value)
    //#WritableFrameContainer.java:44: end of method: Window com.dmdirc.WritableFrameContainer.getFrame()
    
    /** The name of the server notification target. */
    protected static final String NOTIFICATION_SERVER = "server".intern();
    //#WritableFrameContainer.java:47: method: com.dmdirc.WritableFrameContainer.com.dmdirc.WritableFrameContainer__static_init
    //#output(com.dmdirc.WritableFrameContainer__static_init): NOTIFICATION_CHANNEL
    //#output(com.dmdirc.WritableFrameContainer__static_init): NOTIFICATION_SERVER
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.activateFrame()V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.addIconChangeListener(Lcom/dmdirc/interfaces/IconChangeListener;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.addLine(Ljava/lang/StringBuffer;[Ljava/lang/Object;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.addNotificationListener(Lcom/dmdirc/interfaces/NotificationListener;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.addSelectionListener(Lcom/dmdirc/interfaces/SelectionListener;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.clearNotification()V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.close()V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.doNotification(Ljava/lang/String;Lcom/dmdirc/actions/interfaces/ActionType;[Ljava/lang/Object;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getConfigManager()Lcom/dmdirc/config/ConfigManager;
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getIcon()Ljavax/swing/Icon;
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getMaxLineLength()I
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getNotification()Ljava/awt/Color;
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getNumLines(Ljava/lang/String;)I
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.iconUpdated()V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.ownsFrame(Lcom/dmdirc/ui/interfaces/Window;)Z
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.removeIconChangeListener(Lcom/dmdirc/interfaces/IconChangeListener;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.removeNotificationListener(Lcom/dmdirc/interfaces/NotificationListener;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.removeSelectionListener(Lcom/dmdirc/interfaces/SelectionListener;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.sendLine(Ljava/lang/String;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.sendNotification(Ljava/awt/Color;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.setIcon(Ljava/lang/String;)V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.toString()Ljava/lang/String;
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.windowActivated()V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.windowClosed()V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.windowClosing()V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.windowDeactivated()V
    //#output(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.windowOpened()V
    //#output(com.dmdirc.WritableFrameContainer__static_init): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#post(com.dmdirc.WritableFrameContainer__static_init): NOTIFICATION_CHANNEL != null
    //#post(com.dmdirc.WritableFrameContainer__static_init): NOTIFICATION_SERVER != null
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Descendant_Table[com/dmdirc/WritableFrameContainer] == &__Dispatch_Table
    //#post(com.dmdirc.WritableFrameContainer__static_init): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer] == &__Dispatch_Table
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.activateFrame()V == &com/dmdirc/FrameContainer.activateFrame
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.addIconChangeListener(Lcom/dmdirc/interfaces/IconChangeListener;)V == &com/dmdirc/FrameContainer.addIconChangeListener
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V == &com/dmdirc/FrameContainer.addLine
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.addLine(Ljava/lang/StringBuffer;[Ljava/lang/Object;)V == &com/dmdirc/FrameContainer.addLine
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.addNotificationListener(Lcom/dmdirc/interfaces/NotificationListener;)V == &com/dmdirc/FrameContainer.addNotificationListener
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.addSelectionListener(Lcom/dmdirc/interfaces/SelectionListener;)V == &com/dmdirc/FrameContainer.addSelectionListener
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.clearNotification()V == &com/dmdirc/FrameContainer.clearNotification
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.close()V == &com/dmdirc/FrameContainer.close
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V == &despatchNotification
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.doNotification(Ljava/lang/String;Lcom/dmdirc/actions/interfaces/ActionType;[Ljava/lang/Object;)V == &doNotification
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getConfigManager()Lcom/dmdirc/config/ConfigManager; == &com/dmdirc/FrameContainer.getConfigManager
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow; == &getFrame
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window; == &getFrame
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getIcon()Ljavax/swing/Icon; == &com/dmdirc/FrameContainer.getIcon
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getMaxLineLength()I == &getMaxLineLength
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getNotification()Ljava/awt/Color; == &com/dmdirc/FrameContainer.getNotification
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getNumLines(Ljava/lang/String;)I == &getNumLines
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.getServer()Lcom/dmdirc/Server; == &com/dmdirc/FrameContainer.getServer
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V == &handleNotification
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.iconUpdated()V == &com/dmdirc/FrameContainer.iconUpdated
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V == &modifyNotificationArgs
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.ownsFrame(Lcom/dmdirc/ui/interfaces/Window;)Z == &com/dmdirc/FrameContainer.ownsFrame
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z == &processNotificationArg
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.removeIconChangeListener(Lcom/dmdirc/interfaces/IconChangeListener;)V == &com/dmdirc/FrameContainer.removeIconChangeListener
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.removeNotificationListener(Lcom/dmdirc/interfaces/NotificationListener;)V == &com/dmdirc/FrameContainer.removeNotificationListener
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.removeSelectionListener(Lcom/dmdirc/interfaces/SelectionListener;)V == &com/dmdirc/FrameContainer.removeSelectionListener
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.sendLine(Ljava/lang/String;)V == &sendLine
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.sendNotification(Ljava/awt/Color;)V == &com/dmdirc/FrameContainer.sendNotification
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.setIcon(Ljava/lang/String;)V == &com/dmdirc/FrameContainer.setIcon
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List; == &splitLine
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.toString()Ljava/lang/String; == &com/dmdirc/FrameContainer.toString
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.windowActivated()V == &com/dmdirc/FrameContainer.windowActivated
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.windowClosed()V == &com/dmdirc/FrameContainer.windowClosed
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.windowClosing()V == &com/dmdirc/FrameContainer.windowClosing
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.windowDeactivated()V == &com/dmdirc/FrameContainer.windowDeactivated
    //#post(com.dmdirc.WritableFrameContainer__static_init): __Dispatch_Table.windowOpened()V == &com/dmdirc/FrameContainer.windowOpened
    
    /** The name of the channel notification target. */
    protected static final String NOTIFICATION_CHANNEL = "channel".intern();
    //#WritableFrameContainer.java:50: end of method: com.dmdirc.WritableFrameContainer.com.dmdirc.WritableFrameContainer__static_init

    /**
     * Creates a new WritableFrameContainer.
     * 
     * @param icon The icon to use for this container
     * @param config The config manager for this container
     */
    public WritableFrameContainer(final String icon, final ConfigManager config) {
        super(icon, config);
    //#WritableFrameContainer.java:59: method: void com.dmdirc.WritableFrameContainer.com.dmdirc.WritableFrameContainer(String, ConfigManager)
    //#WritableFrameContainer.java:59: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void com.dmdirc.WritableFrameContainer(String, ConfigManager)
    //#    suspicious precondition index: [3]
    //#    Attribs:  Soft
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/FrameContainer.java.awt.Color.BLACK
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): config
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): icon
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this
    //#input(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.__Tag
    //#output(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): new FrameContainer$IconChanger(FrameContainer#2) num objects
    //#output(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): new FrameContainer$IconChanger(FrameContainer#2).__Tag
    //#output(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): new FrameContainer$IconChanger(FrameContainer#2).this$0
    //#output(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): new ListenerList(FrameContainer#1) num objects
    //#output(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): new ListenerList(FrameContainer#1).__Lock
    //#output(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.__Tag
    //#output(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.changer
    //#output(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.config
    //#output(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.icon
    //#output(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.listeners
    //#output(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.notification
    //#new obj(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): new FrameContainer$IconChanger(FrameContainer#2)
    //#new obj(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): new ListenerList(FrameContainer#1)
    //#pre[1] (void com.dmdirc.WritableFrameContainer(String, ConfigManager)): config != null
    //#pre[3] (void com.dmdirc.WritableFrameContainer(String, ConfigManager)): (soft) this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): init'ed(com/dmdirc/FrameContainer.java.awt.Color.BLACK)
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.__Tag == old this.__Tag
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.changer == &new FrameContainer$IconChanger(FrameContainer#2)
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.config == config
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.config != null
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.icon == icon
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): init'ed(this.icon)
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.listeners == &new ListenerList(FrameContainer#1)
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): this.notification == com/dmdirc/FrameContainer.java.awt.Color.BLACK
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): init'ed(this.notification)
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): new FrameContainer$IconChanger(FrameContainer#2) num objects == 1
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): new ListenerList(FrameContainer#1) num objects == 1
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): new FrameContainer$IconChanger(FrameContainer#2).__Tag == com/dmdirc/FrameContainer$IconChanger
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): new FrameContainer$IconChanger(FrameContainer#2).this$0 == this
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): new FrameContainer$IconChanger(FrameContainer#2).this$0 != null
    //#post(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): init'ed(new ListenerList(FrameContainer#1).__Lock)
    //#unanalyzed(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): Effects-of-calling:getFrame
    //#unanalyzed(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void com.dmdirc.WritableFrameContainer(String, ConfigManager)): Effects-of-calling:com.dmdirc.util.ListenerList
    }
    //#WritableFrameContainer.java:60: end of method: void com.dmdirc.WritableFrameContainer.com.dmdirc.WritableFrameContainer(String, ConfigManager)
    
    /**
     * Sends a line of text to this container's source.
     *
     * @param line The line to be sent
     */
    public abstract void sendLine(String line);
    
    /**
     * Returns the internal frame associated with this object.
     *
     * @return The internal frame associated with this object
     */
    @Override
    public abstract InputWindow getFrame();
    
    /**
     * Returns the maximum length that a line passed to sendLine() should be,
     * in order to prevent it being truncated or causing protocol violations.
     *
     * @return The maximum line length for this container
     */
    public abstract int getMaxLineLength();

    /**
     * Splits the specified line into chunks that contain a number of bytes
     * less than or equal to the value returned by {@link #getMaxLineLength()}.
     *
     * @param line The line to be split
     * @return An ordered list of chunks of the desired length
     */
    protected List<String> splitLine(final String line) {
        final List<String> result = new ArrayList<String>();
    //#WritableFrameContainer.java:93: method: List com.dmdirc.WritableFrameContainer.splitLine(String)
    //#WritableFrameContainer.java:93: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: List splitLine(String)
    //#    suspicious precondition index: [4]
    //#    Attribs:  Soft
    //#input(List splitLine(String)): __Descendant_Table[com/dmdirc/Channel]
    //#input(List splitLine(String)): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(List splitLine(String)): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(List splitLine(String)): __Descendant_Table[com/dmdirc/Query]
    //#input(List splitLine(String)): __Descendant_Table[com/dmdirc/Raw]
    //#input(List splitLine(String)): __Descendant_Table[com/dmdirc/Server]
    //#input(List splitLine(String)): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(List splitLine(String)): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(List splitLine(String)): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(List splitLine(String)): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(List splitLine(String)): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(List splitLine(String)): __Descendant_Table[others]
    //#input(List splitLine(String)): __Dispatch_Table.getMaxLineLength()I
    //#input(List splitLine(String)): __Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(List splitLine(String)): com/dmdirc/Channel.__Dispatch_Table.getMaxLineLength()I
    //#input(List splitLine(String)): com/dmdirc/Channel.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(List splitLine(String)): com/dmdirc/GlobalWindow.__Dispatch_Table.getMaxLineLength()I
    //#input(List splitLine(String)): com/dmdirc/GlobalWindow.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(List splitLine(String)): com/dmdirc/MessageTarget.__Dispatch_Table.getMaxLineLength()I
    //#input(List splitLine(String)): com/dmdirc/MessageTarget.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(List splitLine(String)): com/dmdirc/Query.__Dispatch_Table.getMaxLineLength()I
    //#input(List splitLine(String)): com/dmdirc/Query.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(List splitLine(String)): com/dmdirc/Raw.__Dispatch_Table.getMaxLineLength()I
    //#input(List splitLine(String)): com/dmdirc/Raw.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(List splitLine(String)): com/dmdirc/Server.__Dispatch_Table.getMaxLineLength()I
    //#input(List splitLine(String)): com/dmdirc/Server.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(List splitLine(String)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getMaxLineLength()I
    //#input(List splitLine(String)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(List splitLine(String)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getMaxLineLength()I
    //#input(List splitLine(String)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(List splitLine(String)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getMaxLineLength()I
    //#input(List splitLine(String)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(List splitLine(String)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getMaxLineLength()I
    //#input(List splitLine(String)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(List splitLine(String)): line
    //#input(List splitLine(String)): line._tainted
    //#input(List splitLine(String)): this
    //#input(List splitLine(String)): this.__Tag
    //#output(List splitLine(String)): new ArrayList(splitLine#1) num objects
    //#output(List splitLine(String)): return_value
    //#new obj(List splitLine(String)): new ArrayList(splitLine#1)
    //#pre[1] (List splitLine(String)): line != null
    //#pre[4] (List splitLine(String)): (soft) this.__Tag in {com/dmdirc/Channel, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(List splitLine(String)): java.lang.Math:min(...)@103 >= -2_147_483_647
    //#post(List splitLine(String)): return_value == &new ArrayList(splitLine#1)
    //#post(List splitLine(String)): new ArrayList(splitLine#1) num objects == 1
    //#unanalyzed(List splitLine(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(List splitLine(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(List splitLine(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(List splitLine(String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(List splitLine(String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(List splitLine(String)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(List splitLine(String)): Effects-of-calling:getMaxLineLength
    //#unanalyzed(List splitLine(String)): Effects-of-calling:java.lang.String:getBytes
    //#unanalyzed(List splitLine(String)): Effects-of-calling:splitLine
    //#unanalyzed(List splitLine(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(List splitLine(String)): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(List splitLine(String)): Effects-of-calling:java.lang.Math:min
    //#unanalyzed(List splitLine(String)): Effects-of-calling:java.lang.StringBuilder:substring
    //#unanalyzed(List splitLine(String)): Effects-of-calling:java.lang.StringBuilder:delete
    //#test_vector(List splitLine(String)): java.lang.String:indexOf(...)@95: {-2_147_483_648..-1}, {0..4_294_967_295}

        if (line.indexOf('\n') > -1) {
            for (String part : line.split("\n")) {
    //#WritableFrameContainer.java:96: ?use of default init
    //#    init'ed(arr$.length)
    //#    severity: LOW
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: List splitLine(String)
    //#    basic block: bb_2
    //#    assertion: init'ed(arr$.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#WritableFrameContainer.java:96: ?use of default init
    //#    init'ed(len$)
    //#    severity: LOW
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: List splitLine(String)
    //#    basic block: bb_3
    //#    assertion: init'ed(len$)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#WritableFrameContainer.java:96: Warning: test always goes same way
    //#    Test predetermined because i$ == len$
    //#    severity: LOW
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: List splitLine(String)
    //#    from bb: bb_3
    //#    live edge: bb_3-->bb_5
    //#    tested vn: i$ - undefined
    //#    tested vn values: {0}
    //#WritableFrameContainer.java:96: Warning: dead code
    //#    Dead code here because i$ == len$
    //#    severity: LOW
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: List splitLine(String)
    //#    dead bb: bb_4
                result.addAll(splitLine(part));
            }
        } else {
            final StringBuilder remaining = new StringBuilder(line);

            while (remaining.toString().getBytes().length > getMaxLineLength()) {
    //#WritableFrameContainer.java:102: Warning: call too complex - analysis skipped
    //#    call on int getMaxLineLength()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: List splitLine(String)
    //#    unanalyzed callee: int getMaxLineLength()
                int number = Math.min(remaining.length(), getMaxLineLength());
    //#WritableFrameContainer.java:103: Warning: call too complex - analysis skipped
    //#    call on int getMaxLineLength()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: List splitLine(String)
    //#    unanalyzed callee: int getMaxLineLength()

                while (remaining.substring(0, number).getBytes().length > getMaxLineLength()) {
    //#WritableFrameContainer.java:105: Warning: call too complex - analysis skipped
    //#    call on int getMaxLineLength()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: List splitLine(String)
    //#    unanalyzed callee: int getMaxLineLength()
                    number--;
    //#WritableFrameContainer.java:106: ?overflow
    //#    number in {-2_147_483_647..4_294_967_296}
    //#    severity: LOW
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: List splitLine(String)
    //#    basic block: bb_10
    //#    assertion: number in {-2_147_483_647..4_294_967_296}
    //#    VN: number - 1
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {-2_147_483_649}
    //#    Attribs:  Int  Bad singleton  Bad < Exp
                }

                result.add(remaining.substring(0, number));
                remaining.delete(0, number);
            }

            result.add(remaining.toString());
        }

        return result;
    //#WritableFrameContainer.java:116: end of method: List com.dmdirc.WritableFrameContainer.splitLine(String)
    }
    
    /**
     * Returns the number of lines that the specified string would be sent as.
     *
     * @param line The string to be split and sent
     * @return The number of lines required to send the specified string
     */
    public final int getNumLines(final String line) {
        final String[] splitLines = line.split("(\n|\r\n|\r)", Integer.MAX_VALUE);
    //#WritableFrameContainer.java:126: method: int com.dmdirc.WritableFrameContainer.getNumLines(String)
    //#input(int getNumLines(String)): __Descendant_Table[com/dmdirc/Channel]
    //#input(int getNumLines(String)): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(int getNumLines(String)): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(int getNumLines(String)): __Descendant_Table[com/dmdirc/Query]
    //#input(int getNumLines(String)): __Descendant_Table[com/dmdirc/Raw]
    //#input(int getNumLines(String)): __Descendant_Table[com/dmdirc/Server]
    //#input(int getNumLines(String)): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(int getNumLines(String)): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(int getNumLines(String)): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(int getNumLines(String)): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(int getNumLines(String)): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(int getNumLines(String)): __Descendant_Table[others]
    //#input(int getNumLines(String)): __Dispatch_Table.getMaxLineLength()I
    //#input(int getNumLines(String)): com/dmdirc/Channel.__Dispatch_Table.getMaxLineLength()I
    //#input(int getNumLines(String)): com/dmdirc/GlobalWindow.__Dispatch_Table.getMaxLineLength()I
    //#input(int getNumLines(String)): com/dmdirc/MessageTarget.__Dispatch_Table.getMaxLineLength()I
    //#input(int getNumLines(String)): com/dmdirc/Query.__Dispatch_Table.getMaxLineLength()I
    //#input(int getNumLines(String)): com/dmdirc/Raw.__Dispatch_Table.getMaxLineLength()I
    //#input(int getNumLines(String)): com/dmdirc/Server.__Dispatch_Table.getMaxLineLength()I
    //#input(int getNumLines(String)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getMaxLineLength()I
    //#input(int getNumLines(String)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getMaxLineLength()I
    //#input(int getNumLines(String)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getMaxLineLength()I
    //#input(int getNumLines(String)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getMaxLineLength()I
    //#input(int getNumLines(String)): line
    //#input(int getNumLines(String)): line._tainted
    //#input(int getNumLines(String)): this
    //#input(int getNumLines(String)): this.__Tag
    //#output(int getNumLines(String)): return_value
    //#pre[1] (int getNumLines(String)): line != null
    //#post(int getNumLines(String)): return_value == 0
        int lines = 0;
        
        for (String splitLine : splitLines) {
    //#WritableFrameContainer.java:129: ?use of default init
    //#    init'ed(arr$.length)
    //#    severity: LOW
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: int getNumLines(String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(arr$.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#WritableFrameContainer.java:129: ?use of default init
    //#    init'ed(len$)
    //#    severity: LOW
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: int getNumLines(String)
    //#    basic block: bb_2
    //#    assertion: init'ed(len$)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#WritableFrameContainer.java:129: Warning: test always goes same way
    //#    Test predetermined because i$ == len$
    //#    severity: LOW
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: int getNumLines(String)
    //#    from bb: bb_2
    //#    live edge: bb_2-->bb_7
    //#    tested vn: i$ - undefined
    //#    tested vn values: {0}
    //#WritableFrameContainer.java:129: Warning: dead code
    //#    Dead code here because i$ == len$
    //#    severity: LOW
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: int getNumLines(String)
    //#    dead bb: bb_3
    //#WritableFrameContainer.java:129: Warning: dead code continues
    //#    Dead code continues
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: int getNumLines(String)
    //#    dead bb: bb_6
            if (getMaxLineLength() <= 0) {
                lines++;
    //#WritableFrameContainer.java:131: Warning: dead code continues
    //#    Dead code continues
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: int getNumLines(String)
    //#    dead bb: bb_4
            } else {
                lines += (int) Math.ceil(splitLine.getBytes().length
    //#WritableFrameContainer.java:133: Warning: dead code continues
    //#    Dead code continues
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: int getNumLines(String)
    //#    dead bb: bb_5
                        / (double) getMaxLineLength());
            }
        }
        
        return lines;
    //#WritableFrameContainer.java:138: end of method: int com.dmdirc.WritableFrameContainer.getNumLines(String)
    }
    
    /**
     * Processes and displays a notification.
     *
     * @param messageType The name of the formatter to be used for the message
     * @param actionType The action type to be used
     * @param args The arguments for the message
     */
    public void doNotification(final String messageType,
            final ActionType actionType, final Object... args) {
        final List<Object> messageArgs = new ArrayList<Object>();
    //#WritableFrameContainer.java:150: method: void com.dmdirc.WritableFrameContainer.doNotification(String, ActionType, Object[])
    //#WritableFrameContainer.java:150: Warning: suspicious precondition
    //#    The precondition for actionType.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void doNotification(String, ActionType, Object[])
    //#    suspicious precondition index: [2]
    //#WritableFrameContainer.java:150: Warning: suspicious precondition
    //#    The precondition for actionType.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void doNotification(String, ActionType, Object[])
    //#    suspicious precondition index: [5]
    //#    Attribs:  Soft
    //#WritableFrameContainer.java:150: Warning: suspicious precondition
    //#    The precondition for actionType.type.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void doNotification(String, ActionType, Object[])
    //#    suspicious precondition index: [6]
    //#    Attribs:  Soft
    //#WritableFrameContainer.java:150: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void doNotification(String, ActionType, Object[])
    //#    suspicious precondition index: [21]
    //#input(void doNotification(String, ActionType, Object[])): " doesn't exist"._tainted
    //#input(void doNotification(String, ActionType, Object[])): ","._tainted
    //#input(void doNotification(String, ActionType, Object[])): ": "._tainted
    //#input(void doNotification(String, ActionType, Object[])): ": channel "._tainted
    //#input(void doNotification(String, ActionType, Object[])): ":"._tainted
    //#input(void doNotification(String, ActionType, Object[])): "Invalid notification target for type "._tainted
    //#input(void doNotification(String, ActionType, Object[])): "\E"._tainted
    //#input(void doNotification(String, ActionType, Object[])): "\Q"._tainted
    //#input(void doNotification(String, ActionType, Object[])): "self"._tainted
    //#input(void doNotification(String, ActionType, Object[])): NOTIFICATION_CHANNEL
    //#input(void doNotification(String, ActionType, Object[])): NOTIFICATION_SERVER
    //#input(void doNotification(String, ActionType, Object[])): __Descendant_Table[com/dmdirc/Channel]
    //#input(void doNotification(String, ActionType, Object[])): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void doNotification(String, ActionType, Object[])): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void doNotification(String, ActionType, Object[])): __Descendant_Table[com/dmdirc/Query]
    //#input(void doNotification(String, ActionType, Object[])): __Descendant_Table[com/dmdirc/Raw]
    //#input(void doNotification(String, ActionType, Object[])): __Descendant_Table[com/dmdirc/Server]
    //#input(void doNotification(String, ActionType, Object[])): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void doNotification(String, ActionType, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void doNotification(String, ActionType, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void doNotification(String, ActionType, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void doNotification(String, ActionType, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void doNotification(String, ActionType, Object[])): __Descendant_Table[others]
    //#input(void doNotification(String, ActionType, Object[])): __Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): __Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void doNotification(String, ActionType, Object[])): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void doNotification(String, ActionType, Object[])): __Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doNotification(String, ActionType, Object[])): __Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): __Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V
    //#input(void doNotification(String, ActionType, Object[])): __Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z
    //#input(void doNotification(String, ActionType, Object[])): actionType
    //#input(void doNotification(String, ActionType, Object[])): actionType.__Tag
    //#input(void doNotification(String, ActionType, Object[])): actionType.type
    //#input(void doNotification(String, ActionType, Object[])): actionType.type.__Tag
    //#input(void doNotification(String, ActionType, Object[])): args
    //#input(void doNotification(String, ActionType, Object[])): args.length
    //#input(void doNotification(String, ActionType, Object[])): args[0..4_294_967_295]
    //#input(void doNotification(String, ActionType, Object[])): args[0..4_294_967_295].__Tag
    //#input(void doNotification(String, ActionType, Object[])): args[0..4_294_967_295].client
    //#input(void doNotification(String, ActionType, Object[])): args[0..4_294_967_295].time
    //#input(void doNotification(String, ActionType, Object[])): args[0..4_294_967_295].topic
    //#input(void doNotification(String, ActionType, Object[])): com.dmdirc.logger.ErrorLevel.LOW
    //#input(void doNotification(String, ActionType, Object[])): com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Channel.__Descendant_Table[com/dmdirc/Channel]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Channel.__Descendant_Table[others]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Channel.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Channel.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Channel.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Channel.__Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Channel.__Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Channel.__Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/ChannelClientProperty.TEXT_BACKGROUND
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/ChannelClientProperty.TEXT_FOREGROUND
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/CustomWindow.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/FrameContainer.java.awt.Color.BLACK
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Main.controller
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Query.__Descendant_Table[com/dmdirc/Query]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Query.__Descendant_Table[others]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Query.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Query.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Query.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Query.__Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Query.__Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Query.__Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Raw.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Raw.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Raw.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Raw.__Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Raw.__Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Raw.__Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Dispatch_Table.addLineToActive(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Dispatch_Table.addLineToAll(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Dispatch_Table.getChannel(Ljava/lang/String;)Lcom/dmdirc/Channel;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Dispatch_Table.getChildren()Ljava/util/List;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Dispatch_Table.hasChannel(Ljava/lang/String;)Z
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Server.__Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Topic.__Descendant_Table[com/dmdirc/Topic]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Topic.__Descendant_Table[others]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Topic.__Dispatch_Table.getClient()Ljava/lang/String;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Topic.__Dispatch_Table.getTime()J
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/Topic.__Dispatch_Table.getTopic()Ljava/lang/String;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/ActionManager.killSwitch
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/ActionManager.listeners
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void doNotification(String, ActionType, Object[])): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#input(void doNotification(String, ActionType, Object[])): messageType
    //#input(void doNotification(String, ActionType, Object[])): messageType._tainted
    //#input(void doNotification(String, ActionType, Object[])): this
    //#input(void doNotification(String, ActionType, Object[])): this.__Tag
    //#input(void doNotification(String, ActionType, Object[])): this.config
    //#output(void doNotification(String, ActionType, Object[])): com/dmdirc/ServerManager.me
    //#output(void doNotification(String, ActionType, Object[])): new ArrayList(ServerManager#1) num objects
    //#output(void doNotification(String, ActionType, Object[])): new ServerManager(getServerManager#1) num objects
    //#output(void doNotification(String, ActionType, Object[])): new ServerManager(getServerManager#1).__Tag
    //#output(void doNotification(String, ActionType, Object[])): new ServerManager(getServerManager#1).servers
    //#new obj(void doNotification(String, ActionType, Object[])): new ArrayList(ServerManager#1)
    //#new obj(void doNotification(String, ActionType, Object[])): new ServerManager(getServerManager#1)
    //#pre[1] (void doNotification(String, ActionType, Object[])): actionType != null
    //#pre[2] (void doNotification(String, ActionType, Object[])): actionType.__Tag in {com/dmdirc/actions/CoreActionType, com/dmdirc/actions/interfaces/ActionType, com/dmdirc/addons/dcc/actions/DCCActions}
    //#pre[7] (void doNotification(String, ActionType, Object[])): args != null
    //#pre[8] (void doNotification(String, ActionType, Object[])): args.length <= 4_294_967_295
    //#pre[16] (void doNotification(String, ActionType, Object[])): init'ed(com/dmdirc/actions/ActionManager.killSwitch)
    //#pre[21] (void doNotification(String, ActionType, Object[])): this.__Tag in {com/dmdirc/Channel, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#pre[23] (void doNotification(String, ActionType, Object[])): this.config != null
    //#pre[3] (void doNotification(String, ActionType, Object[])): (soft) actionType.type != null
    //#pre[4] (void doNotification(String, ActionType, Object[])): (soft) actionType.type != null
    //#pre[5] (void doNotification(String, ActionType, Object[])): (soft) actionType.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#pre[6] (void doNotification(String, ActionType, Object[])): (soft) actionType.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#pre[9] (void doNotification(String, ActionType, Object[])): (soft) init'ed(args[0..4_294_967_295])
    //#pre[14] (void doNotification(String, ActionType, Object[])): (soft) com/dmdirc/Main.controller != null
    //#pre[19] (void doNotification(String, ActionType, Object[])): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#presumption(void doNotification(String, ActionType, Object[])): java.util.List:toArray(...).length@168 <= 4_294_967_295
    //#presumption(void doNotification(String, ActionType, Object[])): java.util.List:toArray(...)@166 != null
    //#presumption(void doNotification(String, ActionType, Object[])): java.util.List:toArray(...)@168 != null
    //#post(void doNotification(String, ActionType, Object[])): com/dmdirc/ServerManager.me == old com/dmdirc/ServerManager.me
    //#post(void doNotification(String, ActionType, Object[])): new ArrayList(ServerManager#1) num objects == undefined
    //#post(void doNotification(String, ActionType, Object[])): new ArrayList(ServerManager#1) num objects == 0, if init'ed
    //#post(void doNotification(String, ActionType, Object[])): new ServerManager(getServerManager#1) num objects == new ArrayList(ServerManager#1) num objects
    //#post(void doNotification(String, ActionType, Object[])): new ServerManager(getServerManager#1).__Tag == new ArrayList(ServerManager#1) num objects
    //#post(void doNotification(String, ActionType, Object[])): new ServerManager(getServerManager#1).servers == undefined
    //#post(void doNotification(String, ActionType, Object[])): new ServerManager(getServerManager#1).servers == null
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.FrameContainer
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:getFrame
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:getConfigManager
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:hasOptionString
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:getOption
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:despatchNotification
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:addLine
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:getServer
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.Server:addLine
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:addLineToAll
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:addLineToActive
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.WindowManager:findCustomWindow
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:getConfigManager
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:getUI
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getWindow
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:setTitle
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.WindowManager:addWindow
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:open
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:addLine
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.String:format
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.List:add
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:getChildren
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:getCommandTime
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:hasChannel
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:getChannel
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getNickname
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getImportantModePrefix
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getClient
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:getIdent
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:getHost
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getMap
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.messages.ColourManager:getHex
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:instanceof
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:getNickname
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:instanceof
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Arrays:asList
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:parseHostFull
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.Long:valueOf
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:processNotificationArg
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.parser.irc.ChannelInfo:getName
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:getType
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:trigger
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:getArity
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.interfaces.ActionListener:processEvent
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:triggerActions
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.util.ListenerList
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:addLine
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:isVisible
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.parser.irc.IRCStringConverter:toLowerCase
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.List:size
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:readTerm
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:parseStack
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:[Ljava.lang.String;:instanceof
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.StringBuffer:length
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.StringBuffer:insert
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:doServerSubstitutions
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:doComponentSubstitutions
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:getState
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ServerState:equals
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:getCompatibleComponents
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:get
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:getArgTypes
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:test
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:evaluate
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getActiveWindow
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:instanceof
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.util.List:get
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.commandparser.parsers.GlobalCommandParser:getGlobalCommandParser
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:parseCommand
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.StringBuffer:setLength
    //#unanalyzed(void doNotification(String, ActionType, Object[])): Effects-of-calling:java.lang.StringBuffer:append
        final List<Object> actionArgs = new ArrayList<Object>();
        final StringBuffer buffer = new StringBuffer(messageType);

        actionArgs.add(this);

        for (Object arg : args) {
            actionArgs.add(arg);

            if (!processNotificationArg(arg, messageArgs)) {
                messageArgs.add(arg);
            }
        }
        
        modifyNotificationArgs(actionArgs, messageArgs);

        ActionManager.processEvent(actionType, buffer, actionArgs.toArray());

        handleNotification(buffer.toString(), messageArgs.toArray());
    } 
    //#WritableFrameContainer.java:169: end of method: void com.dmdirc.WritableFrameContainer.doNotification(String, ActionType, Object[])
    
    /**
     * Allows subclasses to modify the lists of arguments for notifications.
     * 
     * @param actionArgs The list of arguments to be passed to the actions system
     * @param messageArgs The list of arguments to be passed to the formatter
     */
    protected void modifyNotificationArgs(final List<Object> actionArgs,
            final List<Object> messageArgs) {
        // Do nothing
    }
    //#WritableFrameContainer.java:180: method: void com.dmdirc.WritableFrameContainer.modifyNotificationArgs(List, List)
    //#WritableFrameContainer.java:180: end of method: void com.dmdirc.WritableFrameContainer.modifyNotificationArgs(List, List)
    
    /**
     * Allows subclasses to process specific types of notification arguments.
     * 
     * @param arg The argument to be processed
     * @param args The list of arguments that any data should be appended to
     * @return True if the arg has been processed, false otherwise
     */
    protected boolean processNotificationArg(final Object arg, final List<Object> args) {
        return false;
    //#WritableFrameContainer.java:190: method: bool com.dmdirc.WritableFrameContainer.processNotificationArg(Object, List)
    //#output(bool processNotificationArg(Object, List)): return_value
    //#post(bool processNotificationArg(Object, List)): return_value == 0
    //#WritableFrameContainer.java:190: end of method: bool com.dmdirc.WritableFrameContainer.processNotificationArg(Object, List)
    }
    
    /**
     * Handles general server notifications (i.e., ones not tied to a
     * specific window). The user can select where the notifications should
     * go in their config.
     *
     * @param messageType The type of message that is being sent
     * @param args The arguments for the message
     */
    public void handleNotification(final String messageType, final Object... args) {        
        despatchNotification(messageType, getConfigManager().hasOptionString("notifications",
    //#WritableFrameContainer.java:202: method: void com.dmdirc.WritableFrameContainer.handleNotification(String, Object[])
    //#WritableFrameContainer.java:202: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:hasOptionString(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void handleNotification(String, Object[])
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:hasOptionString(String, String)
    //#WritableFrameContainer.java:202: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.config.ConfigManager:getOption(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void handleNotification(String, Object[])
    //#    unanalyzed callee: String com.dmdirc.config.ConfigManager:getOption(String, String)
    //#WritableFrameContainer.java:202: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void handleNotification(String, Object[])
    //#    suspicious precondition index: [9]
    //#    Attribs:  Soft
    //#input(void handleNotification(String, Object[])): " doesn't exist"._tainted
    //#input(void handleNotification(String, Object[])): ": "._tainted
    //#input(void handleNotification(String, Object[])): ": channel "._tainted
    //#input(void handleNotification(String, Object[])): ":"._tainted
    //#input(void handleNotification(String, Object[])): "Invalid notification target for type "._tainted
    //#input(void handleNotification(String, Object[])): "\E"._tainted
    //#input(void handleNotification(String, Object[])): "\Q"._tainted
    //#input(void handleNotification(String, Object[])): "self"._tainted
    //#input(void handleNotification(String, Object[])): NOTIFICATION_CHANNEL
    //#input(void handleNotification(String, Object[])): NOTIFICATION_SERVER
    //#input(void handleNotification(String, Object[])): __Descendant_Table[com/dmdirc/Channel]
    //#input(void handleNotification(String, Object[])): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void handleNotification(String, Object[])): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void handleNotification(String, Object[])): __Descendant_Table[com/dmdirc/Query]
    //#input(void handleNotification(String, Object[])): __Descendant_Table[com/dmdirc/Raw]
    //#input(void handleNotification(String, Object[])): __Descendant_Table[com/dmdirc/Server]
    //#input(void handleNotification(String, Object[])): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void handleNotification(String, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void handleNotification(String, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void handleNotification(String, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void handleNotification(String, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void handleNotification(String, Object[])): __Descendant_Table[others]
    //#input(void handleNotification(String, Object[])): __Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): __Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void handleNotification(String, Object[])): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void handleNotification(String, Object[])): __Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void handleNotification(String, Object[])): args
    //#input(void handleNotification(String, Object[])): args.length
    //#input(void handleNotification(String, Object[])): args[0..4_294_967_295]
    //#input(void handleNotification(String, Object[])): args[0..4_294_967_295]._tainted
    //#input(void handleNotification(String, Object[])): com.dmdirc.logger.ErrorLevel.LOW
    //#input(void handleNotification(String, Object[])): com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void handleNotification(String, Object[])): com/dmdirc/Channel.__Descendant_Table[com/dmdirc/Channel]
    //#input(void handleNotification(String, Object[])): com/dmdirc/Channel.__Descendant_Table[others]
    //#input(void handleNotification(String, Object[])): com/dmdirc/Channel.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/Channel.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Channel.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void handleNotification(String, Object[])): com/dmdirc/CustomWindow.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void handleNotification(String, Object[])): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void handleNotification(String, Object[])): com/dmdirc/FrameContainer.java.awt.Color.BLACK
    //#input(void handleNotification(String, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void handleNotification(String, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void handleNotification(String, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Main.controller
    //#input(void handleNotification(String, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void handleNotification(String, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void handleNotification(String, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Query.__Descendant_Table[com/dmdirc/Query]
    //#input(void handleNotification(String, Object[])): com/dmdirc/Query.__Descendant_Table[others]
    //#input(void handleNotification(String, Object[])): com/dmdirc/Query.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/Query.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Query.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Raw.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/Raw.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Raw.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void handleNotification(String, Object[])): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void handleNotification(String, Object[])): com/dmdirc/Server.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/Server.__Dispatch_Table.addLineToActive(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/Server.__Dispatch_Table.addLineToAll(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/Server.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/Server.__Dispatch_Table.getChannel(Ljava/lang/String;)Lcom/dmdirc/Channel;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Server.__Dispatch_Table.getChildren()Ljava/util/List;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Server.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void handleNotification(String, Object[])): com/dmdirc/Server.__Dispatch_Table.hasChannel(Ljava/lang/String;)Z
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void handleNotification(String, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void handleNotification(String, Object[])): messageType
    //#input(void handleNotification(String, Object[])): messageType._tainted
    //#input(void handleNotification(String, Object[])): this
    //#input(void handleNotification(String, Object[])): this.__Tag
    //#input(void handleNotification(String, Object[])): this.config
    //#pre[10] (void handleNotification(String, Object[])): this.config != null
    //#pre[1] (void handleNotification(String, Object[])): (soft) args != null
    //#pre[2] (void handleNotification(String, Object[])): (soft) args.length <= 4_294_967_295
    //#pre[3] (void handleNotification(String, Object[])): (soft) init'ed(args[0..4_294_967_295])
    //#pre[5] (void handleNotification(String, Object[])): (soft) com/dmdirc/Main.controller != null
    //#pre[9] (void handleNotification(String, Object[])): (soft) this.__Tag in {com/dmdirc/Channel, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(void handleNotification(String, Object[])): com.dmdirc.config.ConfigManager:getOption(...)@202 != null
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.FrameContainer
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:getFrame
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:getConfigManager
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:hasOptionString
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:getOption
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:despatchNotification
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:addLine
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:getServer
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.Server:addLine
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:addLineToAll
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:addLineToActive
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.ui.WindowManager:findCustomWindow
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:getConfigManager
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:getUI
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getWindow
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:setTitle
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.ui.WindowManager:addWindow
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:open
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:addLine
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.lang.String:format
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.util.List:add
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:getChildren
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:getCommandTime
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:hasChannel
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:getChannel
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.util.ListenerList
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:addLine
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:isVisible
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:com.dmdirc.parser.irc.IRCStringConverter:toLowerCase
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void handleNotification(String, Object[])): Effects-of-calling:java.util.Map:get
                messageType) ? getConfigManager().getOption("notifications", messageType)
                : "self", args);
    }
    //#WritableFrameContainer.java:205: end of method: void com.dmdirc.WritableFrameContainer.handleNotification(String, Object[])
    
    /**
     * Despatches a notification of the specified type to the specified target.
     * 
     * @param messageType The type of the message that is being sent
     * @param messageTarget The target of the message
     * @param args The arguments for the message
     */
    protected void despatchNotification(final String messageType,
            final String messageTarget, final Object... args) {
        
        String target = messageTarget;
    //#WritableFrameContainer.java:217: method: void com.dmdirc.WritableFrameContainer.despatchNotification(String, String, Object[])
    //#WritableFrameContainer.java:217: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    suspicious precondition index: [11]
    //#    Attribs:  Soft
    //#input(void despatchNotification(String, String, Object[])): " doesn't exist"._tainted
    //#input(void despatchNotification(String, String, Object[])): ": "._tainted
    //#input(void despatchNotification(String, String, Object[])): ": channel "._tainted
    //#input(void despatchNotification(String, String, Object[])): ":"._tainted
    //#input(void despatchNotification(String, String, Object[])): "Invalid notification target for type "._tainted
    //#input(void despatchNotification(String, String, Object[])): "\E"._tainted
    //#input(void despatchNotification(String, String, Object[])): "\Q"._tainted
    //#input(void despatchNotification(String, String, Object[])): "self"._tainted
    //#input(void despatchNotification(String, String, Object[])): NOTIFICATION_CHANNEL
    //#input(void despatchNotification(String, String, Object[])): NOTIFICATION_SERVER
    //#input(void despatchNotification(String, String, Object[])): __Descendant_Table[com/dmdirc/Channel]
    //#input(void despatchNotification(String, String, Object[])): __Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void despatchNotification(String, String, Object[])): __Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void despatchNotification(String, String, Object[])): __Descendant_Table[com/dmdirc/Query]
    //#input(void despatchNotification(String, String, Object[])): __Descendant_Table[com/dmdirc/Raw]
    //#input(void despatchNotification(String, String, Object[])): __Descendant_Table[com/dmdirc/Server]
    //#input(void despatchNotification(String, String, Object[])): __Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void despatchNotification(String, String, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void despatchNotification(String, String, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void despatchNotification(String, String, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void despatchNotification(String, String, Object[])): __Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void despatchNotification(String, String, Object[])): __Descendant_Table[others]
    //#input(void despatchNotification(String, String, Object[])): __Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): __Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void despatchNotification(String, String, Object[])): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void despatchNotification(String, String, Object[])): __Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void despatchNotification(String, String, Object[])): args
    //#input(void despatchNotification(String, String, Object[])): args.length
    //#input(void despatchNotification(String, String, Object[])): args[0..4_294_967_295]
    //#input(void despatchNotification(String, String, Object[])): args[0..4_294_967_295]._tainted
    //#input(void despatchNotification(String, String, Object[])): com.dmdirc.logger.ErrorLevel.LOW
    //#input(void despatchNotification(String, String, Object[])): com.dmdirc.logger.ErrorLevel.MEDIUM
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Channel.__Descendant_Table[com/dmdirc/Channel]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Channel.__Descendant_Table[others]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Channel.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Channel.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Channel.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/CustomWindow.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/CustomWindow.__Descendant_Table[others]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/FrameContainer.java.awt.Color.BLACK
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Main.controller
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Query.__Descendant_Table[com/dmdirc/Query]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Query.__Descendant_Table[others]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Query.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Query.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Query.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Raw.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Raw.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Raw.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Server.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Server.__Dispatch_Table.addLineToActive(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Server.__Dispatch_Table.addLineToAll(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Server.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Server.__Dispatch_Table.getChannel(Ljava/lang/String;)Lcom/dmdirc/Channel;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Server.__Dispatch_Table.getChildren()Ljava/util/List;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Server.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/Server.__Dispatch_Table.hasChannel(Ljava/lang/String;)Z
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void despatchNotification(String, String, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void despatchNotification(String, String, Object[])): messageTarget
    //#input(void despatchNotification(String, String, Object[])): messageTarget._tainted
    //#input(void despatchNotification(String, String, Object[])): messageType
    //#input(void despatchNotification(String, String, Object[])): messageType._tainted
    //#input(void despatchNotification(String, String, Object[])): this
    //#input(void despatchNotification(String, String, Object[])): this.__Tag
    //#input(void despatchNotification(String, String, Object[])): this.config
    //#pre[6] (void despatchNotification(String, String, Object[])): messageTarget != null
    //#pre[1] (void despatchNotification(String, String, Object[])): (soft) args != null
    //#pre[2] (void despatchNotification(String, String, Object[])): (soft) args.length <= 4_294_967_295
    //#pre[3] (void despatchNotification(String, String, Object[])): (soft) init'ed(args[0..4_294_967_295])
    //#pre[5] (void despatchNotification(String, String, Object[])): (soft) com/dmdirc/Main.controller != null
    //#pre[11] (void despatchNotification(String, String, Object[])): (soft) this.__Tag in {com/dmdirc/Channel, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#pre[12] (void despatchNotification(String, String, Object[])): (soft) this.config != null
    //#presumption(void despatchNotification(String, String, Object[])): best.__Tag@278 in {com/dmdirc/Channel, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(void despatchNotification(String, String, Object[])): com.dmdirc.config.ConfigManager:getOption(...)@227 != null
    //#presumption(void despatchNotification(String, String, Object[])): init'ed(com.dmdirc.logger.ErrorLevel.LOW)
    //#presumption(void despatchNotification(String, String, Object[])): init'ed(com.dmdirc.logger.ErrorLevel.MEDIUM)
    //#presumption(void despatchNotification(String, String, Object[])): com.dmdirc.ui.interfaces.InputWindow:getCommandParser(...)@279 != null
    //#presumption(void despatchNotification(String, String, Object[])): getFrame(...)@279 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).__Tag@245 == com/dmdirc/Server
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).__Tag@247 == com/dmdirc/Server
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).__Tag@251 == com/dmdirc/Server
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).__Tag@255 == com/dmdirc/Server
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).__Tag@276 == com/dmdirc/Server
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).__Tag@291 == com/dmdirc/Server
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).__Tag@292 == com/dmdirc/Server
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).activeFrame.__Tag@247 in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).channels@245 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).channels@276 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).channels@291 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).channels@292 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).converter@291 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).converter@292 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).queries@245 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...).window@255 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...)@243 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...)@245 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...)@247 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...)@251 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...)@255 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...)@276 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...)@291 != null
    //#presumption(void despatchNotification(String, String, Object[])): getServer(...)@292 != null
    //#presumption(void despatchNotification(String, String, Object[])): java.lang.String:length(...)@223 <= 4_294_967_287
    //#presumption(void despatchNotification(String, String, Object[])): java.util.Iterator:next(...).__Tag@278 in {com/dmdirc/Channel, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#presumption(void despatchNotification(String, String, Object[])): java.util.Iterator:next(...)@278 != null
    //#presumption(void despatchNotification(String, String, Object[])): java.util.Map:get(...)@455 != null
    //#presumption(void despatchNotification(String, String, Object[])): java.util.Map:get(...)@455.__Tag == com/dmdirc/Channel
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.FrameContainer
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:getFrame
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:getConfigManager
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:hasOptionString
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:getOption
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:despatchNotification
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:addLine
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:getServer
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.Server:addLine
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:addLineToAll
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:addLineToActive
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.ui.WindowManager:findCustomWindow
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:getConfigManager
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:getUI
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getWindow
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:setTitle
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.ui.WindowManager:addWindow
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:open
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:addLine
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.lang.String:format
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.util.List:add
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:getChildren
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:getCommandTime
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:hasChannel
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:getChannel
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.logger.Logger:userError
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.util.ListenerList
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:addLine
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.ui.interfaces.Window:isVisible
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:com.dmdirc.parser.irc.IRCStringConverter:toLowerCase
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void despatchNotification(String, String, Object[])): Effects-of-calling:java.util.Map:get
    //#test_vector(void despatchNotification(String, String, Object[])): com.dmdirc.ui.WindowManager:findCustomWindow(...)@251: Inverse{null}, Addr_Set{null}
    //#test_vector(void despatchNotification(String, String, Object[])): java.lang.String:equals(...)@240: {0}, {1}
    //#test_vector(void despatchNotification(String, String, Object[])): java.lang.String:equals(...)@242: {0}, {1}
    //#test_vector(void despatchNotification(String, String, Object[])): java.lang.String:equals(...)@244: {0}, {1}
    //#test_vector(void despatchNotification(String, String, Object[])): java.lang.String:equals(...)@246: {0}, {1}
    //#test_vector(void despatchNotification(String, String, Object[])): java.lang.String:equals(...)@299: {1}, {0}
    //#test_vector(void despatchNotification(String, String, Object[])): java.lang.String:startsWith(...)@220: {0}, {1}
    //#test_vector(void despatchNotification(String, String, Object[])): java.lang.String:startsWith(...)@226: {0}, {1}
    //#test_vector(void despatchNotification(String, String, Object[])): java.lang.String:startsWith(...)@232: {0}, {1}
    //#test_vector(void despatchNotification(String, String, Object[])): java.lang.String:startsWith(...)@248: {0}, {1}
    //#test_vector(void despatchNotification(String, String, Object[])): java.lang.String:startsWith(...)@260: {0}, {1}
    //#test_vector(void despatchNotification(String, String, Object[])): java.lang.String:startsWith(...)@288: {0}, {1}
    //#test_vector(void despatchNotification(String, String, Object[])): java.util.Iterator:hasNext(...)@278: {0}, {1}
    //#test_vector(void despatchNotification(String, String, Object[])): java.util.Map:containsKey(...)@445: {0}, {1}
        String format = messageType;
        
        if (target.startsWith("format:")) {
            format = target.substring(7);
            format = format.substring(0, format.indexOf(':'));
            target = target.substring(8 + format.length());
        }

        if (target.startsWith("group:")) {
            target = getConfigManager().hasOptionString("notifications", target.substring(6))
    //#WritableFrameContainer.java:227: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:hasOptionString(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:hasOptionString(String, String)
    //#WritableFrameContainer.java:227: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.config.ConfigManager:getOption(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: String com.dmdirc.config.ConfigManager:getOption(String, String)
                    ? getConfigManager().getOption("notifications", target.substring(6))
                    : "self";
        }
        
        if (target.startsWith("fork:")) {
            for (String newtarget : target.substring(5).split("\\|")) {
    //#WritableFrameContainer.java:233: ?use of default init
    //#    init'ed(arr$.length)
    //#    severity: LOW
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    basic block: bb_9
    //#    assertion: init'ed(arr$.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#WritableFrameContainer.java:233: ?use of default init
    //#    init'ed(len$)
    //#    severity: LOW
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    basic block: bb_10
    //#    assertion: init'ed(len$)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#WritableFrameContainer.java:233: Warning: test always goes same way
    //#    Test predetermined because i$ == len$
    //#    severity: LOW
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    from bb: bb_10
    //#    live edge: bb_10-->bb_12
    //#    tested vn: i$ - undefined
    //#    tested vn values: {0}
    //#WritableFrameContainer.java:233: Warning: dead code
    //#    Dead code here because i$ == len$
    //#    severity: LOW
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    dead bb: bb_11
                despatchNotification(format, newtarget, args);
            }
            
            return;
        }

        if ("self".equals(target)) {
            addLine(format, args);
        }  else if (NOTIFICATION_SERVER.equals(target)) {
            getServer().addLine(format, args);
    //#WritableFrameContainer.java:243: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: Server getServer()
    //#WritableFrameContainer.java:243: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.Server:addLine(String, Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: void com.dmdirc.Server:addLine(String, Object[])
        } else if ("all".equals(target)) {
            getServer().addLineToAll(format, args);
    //#WritableFrameContainer.java:245: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: Server getServer()
        } else if ("active".equals(target)) {
            getServer().addLineToActive(format, args);
    //#WritableFrameContainer.java:247: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: Server getServer()
        } else if (target.startsWith("window:")) {
            final String windowName = target.substring(7);

            Window targetWindow = WindowManager.findCustomWindow(getServer().getFrame(),
    //#WritableFrameContainer.java:251: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: Server getServer()
    //#WritableFrameContainer.java:251: Warning: method not available - call not analyzed
    //#    call on Window com.dmdirc.ui.WindowManager:findCustomWindow(Window, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: Window com.dmdirc.ui.WindowManager:findCustomWindow(Window, String)
                    windowName);

            if (targetWindow == null) {
                targetWindow = new CustomWindow(windowName, windowName,
    //#WritableFrameContainer.java:255: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: Server getServer()
                        getServer().getFrame()).getFrame();
            }

            targetWindow.addLine(format, args);
    //#WritableFrameContainer.java:259: ?null dereference
    //#    targetWindow != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    basic block: bb_24
    //#    assertion: targetWindow != null
    //#    VN: targetWindow
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad  Uncertain
    //#WritableFrameContainer.java:259: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.Window:addLine(String, Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.Window:addLine(String, Object[])
        } else if (target.startsWith("lastcommand:")) {
            final Object[] escapedargs = new Object[args.length];

            for (int i = 0; i < args.length; i++) {
                escapedargs[i] = "\\Q" + args[i] + "\\E";
            }

            final String command = String.format(target.substring(12), escapedargs);

            WritableFrameContainer best = this;
            long besttime = 0;

            final List<WritableFrameContainer> containers
                    = new ArrayList<WritableFrameContainer>();
            
            containers.add(getServer());
    //#WritableFrameContainer.java:275: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: Server getServer()
            containers.addAll(getServer().getChildren());
    //#WritableFrameContainer.java:276: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: Server getServer()

            for (WritableFrameContainer container : containers) {
                final long time
    //#WritableFrameContainer.java:279: Warning: call too complex - analysis skipped
    //#    call on InputWindow getFrame()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: InputWindow getFrame()
    //#WritableFrameContainer.java:279: Warning: method not available - call not analyzed
    //#    call on CommandParser com.dmdirc.ui.interfaces.InputWindow:getCommandParser()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: CommandParser com.dmdirc.ui.interfaces.InputWindow:getCommandParser()
    //#WritableFrameContainer.java:279: Warning: method not available - call not analyzed
    //#    call on long com.dmdirc.commandparser.parsers.CommandParser:getCommandTime(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: long com.dmdirc.commandparser.parsers.CommandParser:getCommandTime(String)
                        = container.getFrame().getCommandParser().getCommandTime(command);
                if (time > besttime) {
                    besttime = time;
                    best = container;
                }
            }

            best.addLine(format, args);
        } else if (target.startsWith(NOTIFICATION_CHANNEL + ":")) {
           final String channel = String.format(target.substring(8), args);

           if (getServer().hasChannel(channel)) {
    //#WritableFrameContainer.java:291: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: Server getServer()
               getServer().getChannel(channel).addLine(messageType, args);
    //#WritableFrameContainer.java:292: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: Server getServer()
           } else {
               addLine(format, args);
               Logger.userError(ErrorLevel.LOW,
    //#WritableFrameContainer.java:295: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
                       "Invalid notification target for type " + messageType
                       + ": channel " + channel + " doesn't exist");
           }
        } else if (!"none".equals(target)) {
            addLine(format, args);
            Logger.userError(ErrorLevel.MEDIUM,
    //#WritableFrameContainer.java:301: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.WritableFrameContainer
    //#    method: void despatchNotification(String, String, Object[])
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:userError(ErrorLevel, String)
                    "Invalid notification target for type " + messageType + ": " + target);
        }
    }          
    //#WritableFrameContainer.java:304: end of method: void com.dmdirc.WritableFrameContainer.despatchNotification(String, String, Object[])
    
}
    //#WritableFrameContainer.java:: end of class: com.dmdirc.WritableFrameContainer
